Report Results:
Minimum Requirements:
BHEKISISA (@Bhekisisa_MG)
Bhekisisa is an independent Centre for Health Journalism. The information conveyed through them is used and published by numerous other accredited news sources and media agents. The COVID-19 virus is a pandemic, which concerns the healthcare sector of South Africa as a whole, the role of Bhekisisa as an informative platform seems imperative within this context.

In the last month, there has not been any significant changes in the frequency of tweets by Bhekisisa. Except for a rapid spike at the end of June, which could have a correlation to the Covid-19 third wave.
1st most liked tweet of Bhekisisa was a tweet concerning a Covid -19 webinar hosted by Bhekisisa, with the host being their Editor-in-chief, Mia Malan. 2nd Most liked tweet is a tweet concerning the induction of a new type of ATM machine, which is not relevant to this report. 3rd being a tweet mentioning the Bhekisisa hosted webinar regarding the Covid pandemic with a section mentioning covid vaccination sites. The 4th most liked tweet conveyed information pertaining national Covid statistics and the 5th described the situation regarding Johnson & Johnson vaccinations for teachers.

Top hashtags of Bhekisisa are structured as follows: 1. ‘#COVID19SA’, 2. ‘#COVID19’, 3. ‘#BhekisisaResource’, 4. ‘#vaccine’, 5. ‘#VaccineRolloutSA’ 6. ‘#COVID19inSA’, 7. ‘#Pfizer’, 8. ‘#JnJ’ 9. ‘#COVID’, 10. ‘#vaccines’.
The most shared tweet by Bhekisisa is a tweet concerning abortion activism, and as such can be deemed insignificant.

The top mention of @Bhekisisa_MG is that of a Bhekisisa reporter named Joan van Dyk (@vandykjoan), second being ‘@miamalan’. The 3rd and 4th referring to Professor Abdool Karim, who can be viewed as the face of Covid related science in South Africa.

Top words graph: ‘vaccine’ was the fourth most prominent word followed by ‘jab’ at 5th place. The first most frequently used word within the Bhekisisa tweets was ‘archive’, as the Bhekisisa Twitter account uses the word to refer to their own resource pool with which their followers can interact with. The second and third words, ‘people’ and ‘south’ are deemed insignificant.
National Institute of Communicable Diseases (@nicd_sa)
The National Institute for Communicable Diseases (NICD) is a South African National public health institute. Its’ actions are determined by the South African government, reflecting means of response, monitoring, training, diagnostics, and research of communicable diseases. One of its main purposes being outbreak response and surveillance.

Time series showing the frequency of NICD tweets over time indicates that on average more than 90 tweets are made per week except for June 27 where less than 90 tweets were made.
NICD’s most liked tweet contains information regarding the initial outbreak of the SARS-CoV-2 virus, also referred to as covid-19. The 2nd most liked tweet from the NICD account is a tweet praising SA’s frontline health workers in the struggle against the Covid-19 outbreak. The third most liked tweet is a tweet signalling the early increase of confirmed cases within South Africa. The fourth most liked tweet indicates the confirmed cases within South Africa reaching 1505. The 5th most liked tweet is another informative tweet on the growing number of confirmed cases in South Africa.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#FightCOVID19’, 3. ‘#StaySafe’, 4. ‘#COVID19Surveillance’, 5. ‘#FlattenTheCurve’ 6. ‘#StayAtHome’, 7. ‘#SpreadTheFacts’, 8. ‘#coronavirus’ 9. ‘#TisTheSeasonToBeSafe’, 10. ‘#StayAthome’.
The most frequently shared tweet contains information about the rising confirmed cases of COVID-19, at 402 confirmed cases.

The NICD is a major provider of national health information with ‘@HealthZA’ (SA Department of Health) being the most frequent mention within their tweets. Followed by ‘ @nicdsa’ and ‘@DrZweliMkhize’, the National Minister of Health, at the time. The ‘@WHO’ and ‘@SAHPRA1’, two significant Covid-19 related institutes, one being national and the other international.

The most frequent word within NICD tweets is ‘total’, followed by ‘death’ and ‘update’. This could be an indication of COVID statistics being released by the NICD platform. The fourth and fifth words are ‘safe’ and ‘tests’.
South African Department of Health (@HealthZA)
The South African Department of Health is an organizational sector within the South African government concerned with all aspects of national health. The executive department consists of several committees and councils all with the main goal of increasing the health status of the South African citizen.

The frequency of HealthZA tweets do not showcase any noteworthy information.
1st Most liked Tweet is that of a message from SA’s Department of Health announcing that there are recoveries among reported Covid-19 cases. The 2nd referring to international help in SA’s COVID-19 cause, especially that of Cuban medical staff. The 3rd tweet informing the public on details about the second reported covid-related death in SA. The 4th giving an update on confirmed and recovered cases, followed by the 5th which contains information on the spread of Covid through social interactions.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#CoronaVirusSA’, 3. ‘#CoronaVirusUpdate’, 4. ‘#Covid19’, 5. ‘#CoronavirusSA’ 6. ‘#VaccineRolloutSA’, 7. ‘#CoronaVirus’, 8. ‘#StaySafe’ 9. ‘#coronavirus’, 10. ‘#CelebrateSafe’.
The Department of Health’s most shared tweet is an announcement telling citizens who were part of certain cruise trips to contact the department as soon as possible.

‘@GautengHealth’ is among the top five mentions of HealthZA tweets, this is referring to the current severity of the lockdown within the province. Among those in the top 10 mentions are, ‘@CyrilRamaphosa’, ‘@MRCza’, ‘@UNICEFSA’, @nicdsa’, ‘@WHOSouthAfrica’ and ‘@WestCapeHealth’. All these mentions can be related to the Covid-19 pandemic.

The most frequent word is ‘south’ followed by ‘africa’. The logical reasoning for this would be that most tweets would contain these two terms as the account holder is the National Department of Health. The 3rd term is ‘total’ followed by ‘deaths’, as covid statistics are released through this channel. The 5th most frequent word is ‘covid19’ and the 8th is ‘tests’.
Eye Witness News (@ewnreporter)
Eye Witness News is a South African news agency covering media on a broad base of applicable industries and sectors.

Time series of the frequency of tweets by EWN indicates that on average the account tweets in a volatile manner.
None of the most liked tweets of the EWN Twitter account are related to COVID and as such is deemed irrelevant.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#FightCOVID19’, 3. ‘#StaySafe’, 4. ‘#COVID19Surveillance’, 5. ‘#FlattenTheCurve’ 6. ‘#StayAtHome’, 7. ‘#SpreadTheFacts’, 8. ‘#coronavirus’ 9. ‘#StayAthome’, 10. ‘#TisTheSeasonToBeSafe’.
The most frequently shared tweet of News24 is unrelated to covid-19.

The top mentions in EWN tweets are unrelated to Covid-19.

Most frequently words in EWN news tweets are ‘police’, ‘people’, ‘cape’, followed with ‘covid19’ in the 4th position and ‘health’ in 5th.
NEWS24 (@News24)
News24 is on of South Africa’s most prominent online news platforms and was launched in 2007.

There are no significant peaks or low points News24 tweets.
The most liked tweet is unrelated to COVID-19, including the 2nd, 3rd,4th and 5th.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#FightCOVID19’, 3. ‘#StaySafe’, 4. ‘#COVID19Surveillance’, 5. ‘#FlattenTheCurve’ 6. ‘#StayAtHome’, 7. ‘#SpreadTheFacts’, 8. ‘#coronavirus’ 9. ‘#StayAthome’, 10. ‘#TisTheSeasonToBeSafe’.
The most frequently shared tweet of News24 is unrelated to covid-19.

Top mention being ‘@HealthZA’, the South African Department of Health, followed by ‘@nicdsa’ and ‘@DrZweliMkhize’, the South African Minister of Health. The World Health Organisation (@WHO) and SAHPRA (@SAHPRA1), which is a branch of the South African Department of Health tasked with the regulation of all health -related products and clinical trials in SA, are within the top 10 of these mentions.

Most frequenly used word within News24 tweets is ‘covid19’, followed by more irrelevant words such as ‘south’, ‘cape’ and ‘court’.
SABC News (@SABCNews)
The SABC News account was chosen because it is the official Twitter-based digital platform used by the South African Broadcasting Corporation, which is one of the most popular and reputable news media sources in South Africa.

The SABC News time-series graph shows that the SABC twitter account tweets on average more than 40 tweets a day for the past month, except for the 14th June and 4th July 2021 where the average was less than 40.
The table showing the most liked tweets indicates that the top five most liked tweets cover the following topics (in descending order): The political unrest in Eswatini, the constitutional court sentencing former President Jacob Zuma to 15 months imprisonment for contempt of court, the National Liquor Traders Council states that some members vow to defy the ban on alcohol sales, the same as the second tweet mentioned and, lastly, that the former Eskom board chair, Jabu Mabuza, has passed a way due to COVID-19. From these top five tweets only two pertain to the COVID-19 pandemic.

The bar chart showing the top ten hashtags of SABC News Tweets for the past 3200 tweets, indicates that the following hashtags are the most prevalent. “#SABCNews”, “#EURO2020”, “#ICYMI”, “#COVID19”, “#Jacob Zuma”, “#SABCWeather”, “#Euro2020”, “#StateCaptureInquiry”, “#coronavirus”, and “#COVID19SA”.
The table showing the most frequently shared tweet from SABC News is about the political unrest in Eswatini and does not directly pertain to the COVID-19 pandemic.

The bar chart showing the top mentions in SABC News Tweets indicates that the most frequent mentions are “@12H00”, “@YouTube”, “@17H00”, “@18H00”, “@PogbaNo1fan”, “@TheWatchdogSABC” and “@vuyomvoko”. The mentions do not provide any insight about the COVID-19 pandemic.

The bar chart showing the top ten words used in SABC News Tweets indicate that the top ten words are “covid19”, “south”, “president”, “Africa”, “court”, “African”, “health”, “people”, “minister” and “video” are their top words. The chart indicates that the top word is “covid19” which appears in more than 200 tweets.
eNCA (@eNCA)
The eNCA account was chosen because it belongs to the eNCA 24-hour news channel that presents news about South Africa and Africa. The account joined in May 2011.

The eNCA time series graph shows that eNCA tweets more than 50 tweets a day over the past month except for the week before the 7th June 2021, where there were few to zero tweets.
The table showing the most frequently shared tweet as of July 2021 is regarding the death of a Nigerian televangelist TB Joshua.

The bar chart showing the top hashtags in eNCA tweets indicates that (in descending order) “#DStv403”, “#eNCA”, “#COVID19”, “#eNCAs”, “#SouthAfricanMorning”, “#NewsLink”, “#SouthAfricaTonight”, “#PropertyMatters”, “#AllAngles”, “#TheMiddayView” and “#TheLead” are their top hashtags. It should be noted that the COVID-19 pandemic ranks third in eNCA’s top hashtags, while the rest of the hashtags refer to either eNCA themself or the respective programmes on their television channel (DSTV403).
The table showing the most liked tweets indicates that the top five most liked tweets of eNCA are (in descending order) a news report of the death of TB Joshua, news report of Zuma supporters defying lockdown regulations, news report of President Cyril Ramaphosa’s address to the nation and night, a news report of former President Zuma being sentenced to 15 months imprisonment and another report of the same thing.

The bar chart showing the top mentions in eNCA tweets indicates that (in descending order) “@SallyBurdettSA”, “@AbsaSouthAfrica, “@FaithMangope”, “@BetterBondSA”, “@GarethEdwardsSA”, “@ABwanakawa”, “@SiphamandlaGoge”, “@TheRealClementM”, “@MasegoRahlaga” and “@revue” are the top mentions in their tweets.

The bar chart showing the top words in eNCA tweets indicate that (in descending order) “covid19”, “south”, “president”, “Africa”, “court”, “African”, “health”, “people”, “minister” and “video” are the top words used in their tweets. From this figure, it is indicated that the term “covid19” is the most prevalent term in the eNCA tweets collected.
South African Government (@GovernmentZA)
The South African Government account was chosen because it is an official account of the government, providing accurate and trustworthy information regarding the COVID-19 pandemic and lockdown regulations.

The SA Government time series graph shows that the account does not post tweets very regularly, averaging less than 25 tweets a week and their past 3200 tweets span five months. There was a spike in in tweets around March 2021.
The table showing the most frequently shared tweet as of July 2021 is regarding President Cyril Ramaphosa’s address to the nation with regards to the COVID-19 pandemic on 1 February 2021.

The bar chart showing the top hashtags in SA Government tweets indicates that (in descending order) “#COVID19”, “#StaySafe”, “#VaccinateToSaveSouthAfrica”, “#SONA2021”, “#COVID19SA”, “#ChooseVaccination”, “#GrowSouthAfrica”, “#VaccineRolloutSA”, “#RIP JacksonMthembu”, “PostCabinet” and “#Covid19SA”. From this figure it can be seen that majority of the top terms refer to the COVID-19 pandemic or the vaccination of South Africans.
The table showing the most liked tweets indicates that the following are the top five most liked tweets (in descending order): first shipment of Oxford AstraZeneca vaccine doses, the first healthcare worker vaccinated in South Africa, an announcement indicating that President Ramaphosa will meet the arriving shipment of Oxford AstraZeneca vaccines, RIP notice of Jackson Methembu and a report that the President will address the nation on 30 May 2021 with regards to the COVID-19 pandemic.

The bar chart showing the top mentions in SA Government tweets indicates that (in descending order) “@CyrilRamaphosa”, “@DrZwelieMkhize”, “@GovvernmentZA”, “@HealthZA”, “@DDMabuza”, “@ParlimentofRSA”, “@SAPoliceService”, “@DBESA”, “@HigherEduGovZA” and “@GCISMedia” are the top mentions in their tweets.

The bar chart showing the top words in SA Government tweets indicate that (in descending order) “president”, “minister”, “south”, “ramaphosa”, “total”, “africa”, “watch”, “sa”, “vaccination” and “live” are the top words used in their tweets. From this figure, it is indicated that the term “vaccination” is an import and prevalent term in the in the SA Government tweets collected.
South African Government News (@SAgovnews)
Official South African Government News Account on the Twitter Platform.

Among the top 5 most liked tweets from the ‘@SAgovnews’ account none seem to hold relevant information on covid 19.

Top hashtags are structured as follows: 1. ‘#COVID19’, 2. ‘#SONA2021’, 3. ‘#VaccineRolloutSA’, 4. ‘#PostCabinet’, 5. ‘#StaySafe’, 6. ‘#RamaphosaQandA’, 7. ‘#PostCabMediaBriefing’, 8. ‘#BuildingANewEconomy’, 9. ‘#CrimeStatistics’ 10. ‘#FreedomDay2021’
The official news agency of the South African Government’s most frequently shared tweet is not relevant to this report.

The top mentions within the captured tweets of ‘@SAgovnews’ are: 1. ‘@CyrilRamaphosa’ 2. ‘@HealthZA’ 3. ‘@DrZweliMkhize’ 4. ‘@PresidencyZA’ 5. ‘@SAPoliceService’.

The most frequently used word is ‘read’, due to the account using it as an indication of extended reading material through using “[Read]” in the beginning of certain tweets.
Health24 (@Health24com)
Health24 is a branch of News24, difference being that they specialise in healthcare related news, whereas News24 takes a more general appraoch.

The 4th most liked tweet of Health24 pertains that of an article describing the lungs of COVID-19 patients, the only Health24 tweet relevant on this plot.

Top hashtags are structured as follows: 1. ‘#BeyondBeauty’, 2. ‘#SkinCare’, 3. ‘#coronavirus’, 4. ‘#Covid19’, 5. ‘#SkinRenewalSA’, 6. ‘#asthma’, 7. ‘#Tena’, 8. ‘#beyondbeauty’, 9. ‘#SkinRenewal’ 10. ‘#Coronavirus’
The most frequently shared tweet concerns the psychological implications on doctors because of the COVID-19 epidemic.

The top mentions within the captured tweets of ‘@SAgovnews’ are: 1. ‘@CyrilRamaphosa’ 2. ‘@HealthZA’ 3. ‘@DrZweliMkhize’ 4. ‘@PresidencyZA’ 5. ‘@SAPoliceService’.

The 4th most frequently used word is ‘health’, followed by ‘covid19’ at 7th place. Those are solely applicable to this report.
Text Networks
Text Networks are a representation of the relationship between words. These networks are able to represent a corpus of documents or words, where each document or word represents a node and the edges which connect nodes represent how similar words or documents are to each other. In this report, text networks were used to determine how frequent words would occur along side each other, where words represent nodes and edges represent the frequency of the words’ occurrence. (Bail, 2020)
Many benefits exist when using text networks. Text networks help recognise and understand patterns within text and how they are connected. Text networks are workable with text of any length whereas topic modelling only works with short text. By identifying social clusters in texts more insight can be derived from text, as opposed to more simple text analysis techniques.
Author-based Text Network Modeling of All Media Sources:

From the author-based text network figures above, it can be surmised that there are two author clusters or communities. One which consists of SABC News, South African Government News and Health24.com. Another which consists of eNCA, Bhekisisa, EWN and News24. At closer inspection, it can be seen that there is stronger similarity between SA Government News and Health24.com than SABC News. There is strong similarity between eNCA and EWN, Bhekisisa and EWN, as well as News24 and EWN. It should be noted that there is not a strong similarity between Bhekisisa and eNCA, as well as a moderate similarity between EWN and News24 when compared to its other connections.
Word-based Text Network Modeling of All Media Sources:

In the word-based text network, there has been six clusters or communities identified. The latent theme within the pink cluster is the reporting by SABC News on COVID-19. The latent theme within the black cluster focuses on Bhekisisa’s reporting. The red cluster focuses on the ANC. The cyan (bright light blue) cluster focuses on COVID-19 vaccinations. The green cluster focuses on COVID-19 cases and hospitalizations. The blue cluster focuses on COVID-19 case, recovery, death and other associated data. There is a connection between the cyan, green and blue clusters indicating strong similarity in words used to convey similar themes.
Sentiment Analysis

‘virus’, ‘infected’, ‘epidemic’ are among the top five most negative words. ‘break’ and ‘breaks’ are among the other top five words, an indication of the term ‘outbreak’/’outbreaks’ being used frequently. ‘severe’, ‘fever’ and ‘risk’ are among the top ten negative words. ‘protect’, ‘support’ and ‘effective’ are the top four most positive words with ‘free’ being the top ranked positive sentiment word.

The top ten negative words in NICD tweets could be categorised as being in relation to the coronavirus. Among these negative words are ‘symptoms’, ‘risk’, ‘virus’, ‘sick’, ‘infection’, ‘illness’ and ‘infections’. The top 10 most positive words are ‘safe’, ‘protective’, ‘protect’, ‘smart’, ‘regard’, ‘loved’, ‘correct’, ‘recovery’, ‘ready’ and ‘encourage’.

As with the NICD negative sentiment visualisation, ‘regrettably’ seems to be the word carrying the top negative sentiment within in their tweets. Other words are, ‘risk’, ‘virus’, ‘breakdown’, ‘death’, ‘symptoms’, ‘infections’, ‘isolation’, ‘infection’ and ‘infections’. ‘protect’, ‘recovery’, ‘loved’ are the top three most positive words, followed by ‘positive’, ‘safe’, ‘festive’, ‘support’, ‘patient’, ‘free’ and ‘clean’.

‘infections’, ‘death’ and ‘prison’ are among the top three most negative words. ‘support’, ‘top’ and ‘positive’ are among the top three most positive News24 words. Other than that, there are no other Covid-19 related words.

The top negative words from the Health24 twitter handle are ‘risk’, ‘cancer’, ‘symptoms’, ‘loss’, ‘suffer’, ‘lose’, ‘stress’, ‘allergies’, ‘pain’ and ‘infection’. The top positive words from Health24 are ‘fans’, ‘healthy’, ‘win’, ‘benefits’, ‘protect’, ‘boost’, ‘safe’, ‘improve’, ‘top’ and ‘easy’. The great majority of these words are health related.

‘breaking’ is the most negative word within the eNCA tweets. ‘infections’, ‘virus’ and ‘death’ are among the top 10 most negative words. ‘support’ ‘hot’ ‘free’ ‘top’ ‘premier’ ‘ready’ ‘valuable’ ‘led’ ‘dedicated’ and ‘boost’ are the ten most positive words.

A conclusion can be made that government agencies aim to impose emotions of a more tranquil/positive nature, in opposition to private agencies who solely want to invoke an emotion on any sides of the sentiment spectrum, being that outright negative or outright positive.

LS0tDQp0aXRsZTogIlNNIEhvbm91cnMgIEluZm9ybWF0aW9uIGFuZCBLbm93bGVkZ2UgaW4gT3JnYW5pc2F0aW9ucyBEYXRhIEFuYWx5c2lzIEFzc2lnbm1lbnQgMjogRGF0YSBDb2xsZWN0aW9uIGFuZCBUZXh0IE1pbmluZyINCmF1dGhvcjogIkNocmlzdGlhbiBNdWxsZXIgKDIxODI1NzkzKSAmIEdpbGxpYW0gdmFuIGRlciBNZXJ3ZSAoMjE2NjA0MDkpIg0Kb3V0cHV0OiBwZGZfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgUGFja2FnZXMgbG9hZGVkIGZvciB1c2UgaW4gdGhpcyByZXBvcnQNCmxpYnJhcnkodGlueXRleCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShydHdlZXQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkodG9waWNtb2RlbHMpDQpsaWJyYXJ5KHN0bSkNCmxpYnJhcnkoZGV2dG9vbHMpDQpsaWJyYXJ5KHRleHRuZXRzKQ0KbGlicmFyeShodHRwdXYpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoaHRtbHdpZGdldHMpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkodHdpdHRlUikNCmxpYnJhcnkoTkxQKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmxpYnJhcnkoaHR0cikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGV4cGxvcmF0b3J5KQ0KbGlicmFyeShzZW50aW1lbnRyKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeSh1ZHBpcGUpDQpsaWJyYXJ5KGxkYXR1bmluZykNCmxpYnJhcnkocXVhbnRlZGEpDQpsaWJyYXJ5KHZhZGVyKQ0KYGBgDQoNCiMgQmFja2dyb3VuZCBJbmZvcm1hdGlvbiBhbmQgUmVwb3J0IE91dGxpbmU6DQpUaGlzIGlzIGEgcHJvZmVzc2lvbmFsIGRhdGEgYW5hbHlzaXMgcmVwb3J0IGRvY3VtZW50aW5nIHRoZSBDb3JvbmF2aXJ1cywgYWxzbyBrbm93biBhcyBDb3ZpZC0xOSwgaW4gcmVsYXRpb24gdG8gaXRzIHNwcmVhZCBpbiBTb3V0aCBBZnJpY2Egd2l0aGluIGEgdGltZWZyYW1lIG9mIDYgbW9udGhzLiBUaGUgYWltIG9mIHRoaXMgcmVwb3J0IGlzIHRvIHNob3djYXNlIGluc2lnaHRzIGdhdGhlcmVkIHRocm91Z2ggdGhlIGFjcXVpc2l0aW9uIGFuZCBwcm9jZXNzaW5nIG9mIHR3ZWV0cyBmcm9tIGFwcGxpY2FibGUgbWVkaWEgYWdlbmNpZXMsIGZhY2lsaXRhdGVkIGJ5IHRoZSBzb2NpYWwgbWVkaWEgcGxhdGZvcm0gVHdpdHRlci4gVGhlIHJlc3VsdCwgd2lsbCByZWZsZWN0IGEgYm9keSBvZiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVkIGluIGEgbWFubmVyIHJlZmxlY3RpbmcgdGhhdCBvZjoNCg0KMSkgQmFja2dyb3VuZCBJbmZvcm1hdGlvbiBhbmQgSW50cm9kdWN0aW9uDQoNCjIpIERhdGEgYWNxdWlzaXRpb24gYW5kIFJlYXNvbmluZzogYSkgZGF0YSByZWFkIGlucw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKSBhbmQgZGF0YSBjbGVhbmluZyB3aXRoIHByZS1wcm9jZXNzaW5nLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjMpIFJlcG9ydCBSZXN1bHRzIGNvbnNpc3Rpbmcgb2YgYSkgaW5kaXZpZHVhbCBkYXRhIHNvdXJjZSBqdXN0aWZpY2F0aW9uIGFuZCBwbG90IGRlc2NyaXB0aW9ucyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYikgd2l0aCBmdXJ0aGVyIGltcGxlbWVudGF0aW9uIG9mIHZhcmlvdXMgdGV4dCBhbmFseXNpcyB0b29scy4NCiAgICAgICAgICAgDQpBIHRvdGFsIG9mIHRlbiBtZWRpYSBzb3VyY2VzIHdlcmUgc2VsZWN0ZWQgaW5pdGlhbGx5LiBFYWNoIHVuZGVyZ29pbmcgYSBtaXh0dXJlIG9mIGFuYWx5c2lzIHVzaW5nIGEgdmFyaWV0eSBvZiBkYXRhL3RleHQgYW5hbHlzaXMgdG9vbHMgYW5kIG1lYW5zIG9mIHZpc3VhbGlzYXRpb24uIFRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgd2VyZSBnYXRoZXJlZCBhbmQgZm9ybXVsYXRlZCB0aHJvdWdoIGNvbnN1bHRpbmcgdGhlIGxhdGVzdCAzMjAwIHR3ZWV0cyBvZiB0aGUgb2ZmaWNpYWwgbWVkaWEgYWdlbmN5IFR3aXR0ZXIgYWNjb3VudHMgZGVzY3JpYmVkIGJlbG93LiBJbiBwcm9jZXNzaW5nIHRoZXNlIHR3ZWV0cywgc2l4IGludHJvZHVjdG9yeSBpbnNpZ2h0cyB3ZXJlIGNob3NlbiB0byBleHByZXNzIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBuYW1lbHksIEZyZXF1ZW5jeSBvZiBUd2VldHMsIE1vc3QgTGlrZWQgVHdlZXRzLCBUb3AgSGFzaHRhZ3MsIE1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXRzLCBUb3AgTWVudGlvbnMgYW5kIFRvcCB3b3Jkcy4gVGhpcyBwcm9jZXNzLCB1c2luZyB0aGVzZSBwcmVkZXRlcm1pbmVkIHNpeCBpbnNpZ2h0cyB3aWxsIGJlIHJlcGVhdGVkIGJ1dCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYWxsIHRlbiBtZWRpYSBzb3VyY2VzLg0KDQpJdCBpcyBpbXBlcmF0aXZlIHRvIG5vdGUsIHRoYXQgYWZ0ZXIgY2FyZWZ1bCBjb25zaWRlcmF0aW9uIGl0IHdhcyBkZWNpZGVkIHVwb24gdG8gb25seSB1c2Ugc2l4IG1lZGlhIHNvdXJjZXMgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuIFRoaXMgZGVjaXNpb24gd2FzIG1hZGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgY3VsdGl2YXRlZCB0aHJvdWdoIHRoZSBzaXggaW5zaWdodHMgcHJlc2VudGVkIGFib3ZlLiBUaGVzZSBtZWRpYSBzb3VyY2VzIGFyZSBCaGVraXNpc2EsIE5JQ0QsIEhlYWx0aDI0LCBIZWFsdGhaQSwgTmV3czI0IGFuZCBlTkNBLlRoZSBhdXRob3IgLWJhc2VkIHRleHQgbmV0d29yayBkZXNjcmliZWQgbGF0ZXIgaW4gdGhpcyByZXBvcnQgdXNlcyBhbGwgMTAgbWVkaWEgYWNjb3VudHMsIGJ1dCBvdGhlciB0aGFuIHRoYXQsIGFsbCBvdGhlciBhbmFseXNpcyB0b29scyANCmFyZSBsaW1pdGVkIHRvIHVzaW5nIG9ubHkgdGhlIGNob3NlbiBzaXggbWVkaWEgYWNjb3VudHMuDQoNCg0KDQojIyBTb3V0aCBBZnJpY2FuIFR3aXR0ZXIncyBUcmVuZGluZyBIYXNodGFncw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgQ29tbWVudGVkIG91dCBjb2RlIHNlY3Rpb25zICBhcmUgdGhlcmUgYmVjYXVzZSB0aGV5ICB3ZXJlIHV0aWxpemVkIGFuZCB0aGVuIGNvbW1lbnRlZCBvdXQsIHNvIGFzIHRvIHByZXNlcnZlIGRhdGEgaW50ZWdyaXR5IGFuZCB0aGUgdGltZWxpbmVzcyBvZiB0aGUgYW5hbHlzZXMuDQoNCiNnZXQgdHdlZXRzDQoNCiMgc2FfdHJlbmRzIDwtIA0KIyAgIGdldF90cmVuZHMoInNvdXRoIGFmcmljYSIpDQojIA0KIyBzYXZlUkRTKHNhX3RyZW5kcywgZmlsZSA9ICJzYV90cmVuZHMucmRzIikNCg0Kc2FfdHJlbmRzIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvc2FfdHJlbmRzLnJkcyIpDQoNCiNzZWxlY3QNCnRvcF9zYV90cmVuZHMgPC0gDQogIHNhX3RyZW5kcyU+JSANCmFycmFuZ2UoLXR3ZWV0X3ZvbHVtZSkgJT4lDQp0b3BfbigxMCwgdHdlZXRfdm9sdW1lKSAlPiUgDQpzZWxlY3QodHJlbmQsIHR3ZWV0X3ZvbHVtZSkNCg0KI1Bsb3QNCmdncGxvdCh0b3Bfc2FfdHJlbmRzLCBhZXMoeCA9IHJlb3JkZXIodHJlbmQsIHR3ZWV0X3ZvbHVtZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0d2VldF92b2x1bWUgKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSArDQogIHhsYWIoIkhhc2h0YWdzIikgKw0KICB5bGFiKCJWb2x1bWUgb2YgVHdlZXRzIikgKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIGdndGl0bGUoIlNvdXRoIEFmcmljYSdzIFRyZW5kaW5nIEhhc2h0YWdzIikrDQogIGxhYnMoY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKQ0KYGBgDQoNCkF0IHByZXNlbnQsIHRoZXJlIGlzIG5vIHRyZW5kaW5nIGhhc2h0YWcgdGhhdCBkaXJlY3RseSBwZXJ0YWlucyB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIHJhdGhlciBpbnN0ZWFkIG1vc3QgaGFzaHRhZ3MgcGVydGFpbiB0byB0aGUgcG9saXRpY2FsIGFuZCBzb2NpYWwgaGFwcGVuaW5nIGluIEdhdXRlbmcgYW5kIEt3YVp1bHUtTmF0YWwgZHVlIHRvIEphY29iIFp1bWEncyBhcnJlc3QuIEhhc2h0YWdzIHRoYXQgY2FuIGluZGlyZWN0bHkgYmUgYXR0cmlidXRlZCB0byB0aGUgcGFuZGVtaWMgaW5jbHVkZSAiaHVuZ2VyIiBhbmQgInBvdmVydHkiIGR1ZSB0byB0aGUgZWNvbm9taWMgaW1wYWN0IG9mIHRoZSBwYW5kZW1pYyBhbmQgbG9ja2Rvd24gcmVndWxhdGlvbnMuDQoNCiMgSG93IGFuZCB3aGVyZSBkYXRhIGlzIGNvbGxlY3RlZDoNCkluIGFjcXVpcmluZyB0aGUgbmVlZGVkIHR3ZWV0cyB3aXRoIG1ldGEtZGF0YSwgVHdpdHRlciBBUEkgVjEgd2FzIHV0aWxpc2VkLiBUaGUgcmVzdWx0aW5nIGRhdGEgZnJhbWVzIHVuZGVyZ28gcHJvY2Vzc2luZyB0b3dhcmRzIHRoZSBkZXNpcmVkIG91dHB1dC4NCg0KVGhlIGRhdGEgdXNlZCBpbiB0aGlzIHJlcG9ydCB3YXMgYWNxdWlyZWQgZnJvbSBhIHZhcmlldHkgb2YgbmV3cyBtZWRpYSBUd2l0dGVyIGFjY291bnRzLCBhcyB3ZWxsIGFzIENvdmlkLTE5IHZhY2NpbmF0aW9uIGRhdGEgZnJvbSB0aGUgTWVkaWFoYWNrIGdyb3VwLiBUaGUgVHdpdHRlciBhY2NvdW50IGRhdGEgd2FzIGFjcXVpcmVkIHdpdGggdGhlIHVzZSBvZiB0aGUgVHdpdHRlciBBUEkgdmlhIHRoZSBgYGB0d2l0dGVyUmBgYCBhbmQgYGBgcnR3ZWV0YGBgIHBhY2thZ2VzIGluIFIuIFRoZSBhY2NvdW50c+KAmSB0d2VldCBkYXRhIHdhcyBmaXJzdCBvYnRhaW5lZCB1c2luZyB0aGUgYGBgZ2V0X3RpbWVsaW5lKClgYGAgZnVuY3Rpb24sIHRoZXJlYWZ0ZXIgdGhlIGRhdGEgd2FzIHNhdmVkIGJ5IHVzaW5nIHRoZSBgYGBzYXZlUkRTKClgYGAgZnVuY3Rpb24uIFRoZSBkYXRhIHdhcyBzYXZlZCBzbyB0aGF0IHdoaWxlIHRoZSBhbmFseXNlcyB3ZXJlIGNvbmR1Y3RlZCwgdGhlIGNoYW5nZXMgaW4gVHdpdHRlciBkYXRhIHdvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVwb3J0LiBUaGUgc2F2ZWQgYWNjb3VudCB0d2VldCBkYXRhIHdhcyB0aGVuIHJlYWQgaW4gYW5kIHN0b3JlZCBieSB1c2luZyB0aGUgYGBgcmVhZFJEUygpYGBgIGZ1bmN0aW9uLiANCg0KIyMgUmVhZGluZyBpbiBhbmQgc2F2aW5nIFR3aXR0ZXIgYWNjb3VudCB0aW1lbGluZXMNCg0KYGBge3IgR0VUIFRJTUVMSU5FLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgZWNobz1GQUxTRX0NCiMgPC0gDQojZ2V0X3RpbWVsaW5lKCJAQmhla2lzaXNhX01HIiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRiwNCiMgICAgICAgICAgICAgICAgcmV0cnlvbnJhdGVsaW1pdCA9IFRSVUUpDQoNCmJoZWtpc2lzYV90d2VldHMgPC0gcmVhZFJEUygiYmFja3VwX3R3ZWV0cy9iaGVraXNpc2FfdHdlZXRzLnJkcyIpDQoNCiMgc2F2ZVJEUyhiaGVraXNpc2FfdHdlZXRzLCBmaWxlID0gImJoZWtpc2lzYV90d2VldHMucmRzIikNCiMgDQojbmljZF90d2VldHMgPC0gDQojICBnZXRfdGltZWxpbmUoIkBuaWNkX3NhIiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRikNCiMgDQojc2F2ZVJEUyhuaWNkX3R3ZWV0cywgZmlsZSA9ICJuaWNkX3R3ZWV0cy5yZHMiKQ0KDQpuaWNkX3R3ZWV0cyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL25pY2RfdHdlZXRzLnJkcyIpDQoNCiNoZWFsdGh6YV90d2VldHMgPC0gDQojICAgZ2V0X3RpbWVsaW5lKCJASGVhbHRoWkEiLCBuID0gMzIwMCwgaW5jbHVkZV9ydHMgPSBGKQ0KIyANCiMgc2F2ZVJEUyhoZWFsdGh6YV90d2VldHMsIGZpbGUgPSAiaGVhbHRoemFfdHdlZXRzLnJkcyIpDQoNCmhlYWx0aHphX3R3ZWV0cyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2hlYWx0aHphX3R3ZWV0cy5yZHMiKQ0KIA0KI2V3bnJlcG9ydGVyX3R3ZWV0cyA8LQ0KIyAgZ2V0X3RpbWVsaW5lKCJAZXducmVwb3J0ZXIiLCBuID0gMzIwMCwgaW5jbHVkZV9ydHMgPSBGKQ0KIyANCiMgc2F2ZVJEUyhld25yZXBvcnRlcl90d2VldHMsIGZpbGUgPSAiZXducmVwb3J0ZXJfdHdlZXRzLnJkcyIpDQoNCmV3bnJlcG9ydGVyX3R3ZWV0cyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2V3bnJlcG9ydGVyX3R3ZWV0cy5yZHMiKQ0KDQojI25ld3MyNF90d2VldHMgPC0gDQojICAgZ2V0X3RpbWVsaW5lKCJATmV3czI0IiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRikNCiMgDQojIHNhdmVSRFMobmV3czI0X3R3ZWV0cywgZmlsZSA9ICJuZXdzMjRfdHdlZXRzLnJkcyIpDQoNCm5ld3MyNF90d2VldHMgPC0gcmVhZFJEUygiYmFja3VwX3R3ZWV0cy9uZXdzMjRfdHdlZXRzLnJkcyIpDQoNCiNTQWdvdm5ld3NfdGltZWxpbmVfZGYgPC0NCiMgIGdldF90aW1lbGluZSgiQFNBZ292bmV3cyIsIG4gPSAzMjAwLCBpbmNsdWRlX3J0cyA9IEYpDQojIA0KIyBzYXZlUkRTKFNBZ292bmV3c190aW1lbGluZV9kZiwgZmlsZSA9ICJTQWdvdm5ld3NfdGltZWxpbmVfZGYucmRzIikNCg0KU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmLnJkcyIpDQoNCiAjaGVhbHRoMjRfdGltZWxpbmVfZGYgPC0gDQogIyAgZ2V0X3RpbWVsaW5lKCJASGVhbHRoMjRjb20iLCBuID0gMzIwMCwgaW5jbHVkZV9ydHMgPSBGKQ0KIyANCiMgc2F2ZVJEUyhoZWFsdGgyNF90aW1lbGluZV9kZiwgZmlsZSA9ICJoZWFsdGgyNF90aW1lbGluZV9kZi5yZHMiKQ0KDQpoZWFsdGgyNF90aW1lbGluZV9kZiA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2hlYWx0aDI0X3RpbWVsaW5lX2RmLnJkcyIpDQoNCiAjR292ZXJubWVudFpBX3RpbWVsaW5lX2RmIDwtDQogIyAgZ2V0X3RpbWVsaW5lKCJAR292ZXJubWVudFpBIiwgbiA9IDMyMDAsIGluY2x1ZGVfcnRzID0gRikNCiMgDQojIHNhdmVSRFMoR292ZXJubWVudFpBX3RpbWVsaW5lX2RmLCBmaWxlID0gIkdvdmVybm1lbnRaQV90aW1lbGluZV9kZi5yZHMiKQ0KDQpHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYgPC0gcmVhZFJEUygiYmFja3VwX3R3ZWV0cy9Hb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYucmRzIikNCg0KI3NhYmNfbmV3c190aW1lbGluZV9kZiA8LSANCiMgICBnZXRfdGltZWxpbmUoIkBTQUJDTmV3cyIsIG4gPSAzMjAwLCBpbmNsdWRlX3J0cyA9IEYpDQojIA0KIyBzYXZlUkRTKHNhYmNfbmV3c190aW1lbGluZV9kZiwgZmlsZSA9ICJzYWJjX25ld3NfdGltZWxpbmVfZGYucmRzIikNCg0Kc2FiY19uZXdzX3RpbWVsaW5lX2RmIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvc2FiY19uZXdzX3RpbWVsaW5lX2RmLnJkcyIpDQoNCiNlbmNhX3RpbWVsaW5lX2RmIDwtIA0KIyAgZ2V0X3RpbWVsaW5lKCJAZU5DQSIsIG4gPSAzMjAwLCBpbmNsdWRlX3J0cyA9IEYpDQojIA0KIyBzYXZlUkRTKGVuY2FfdGltZWxpbmVfZGYsIGZpbGUgPSAiZW5jYV90aW1lbGluZV9kZi5yZHMiKQ0KDQplbmNhX3RpbWVsaW5lX2RmIDwtIHJlYWRSRFMoImJhY2t1cF90d2VldHMvZW5jYV90aW1lbGluZV9kZi5yZHMiKQ0KDQp2YWNjaW5hdGlvbnMgPC0gDQogIHJlYWQuY3N2KCJodHRwOi8vYXBpLm1lZGlhaGFjay5jby56YS9hZGgvc2EtdmFjY2luYXRpb25zLmNzdiIpDQoNCiMgam9pbnRfdGltZWxpbmVzIDwtDQojICAgZ2V0X3RpbWVsaW5lKGMoIkBCaGVraXNpc2FfTUciLCAiQG5pY2Rfc2EiLCAiQGVOQ0EiLCAiQEhlYWx0aFpBIiwgIkBOZXdzMjQiLCAiQEhlYWx0aDI0Y29tIiksIG4gPSAzMjAwKQ0KIyANCiMgc2F2ZVJEUyhqb2ludF90aW1lbGluZXMsIGZpbGUgPSAiam9pbnRfdGltZWxpbmVzLnJkcyIpDQoNCmpvaW50X3RpbWVsaW5lcyA8LSByZWFkUkRTKCJiYWNrdXBfdHdlZXRzL2pvaW50X3RpbWVsaW5lcy5yZHMiKQ0KDQpgYGANCg0KIyMgQ2xlYW5pbmcgYW5kIFByZS1wcm9jZXNzaW5nIERhdGE6DQoNCkVhY2ggbWVkaWEgc291cmNlJ3MgdHdlZXQgZGF0YSB3YXMgcHJlLXByb2Nlc3NlZCBhbmQgY2xlYW5lZC4gVGhpcyB3YXMgZG9uZSBieSBmaXJzdCBjcmVhdGluZyBhIGNvcnB1cyBvZiB0aGUgdHdlZXQgZGF0YSwgdGhlbiB1bi1uZXN0aW5nIHRoZSB0b2tlbnMgb2YgdGhlIHRleHQgdmFyaWFibGUsIHRoZXJlYWZ0ZXIgd2UgcmVtb3ZlZCBzdG9wIHdvcmRzLCBwdW5jdHVhdGlvbiwgYW5kIG90aGVyIHVubmVjZXNzYXJ5IHdvcmRzIHN1Y2ggYXMgImh0dHBzLCBodHRwLCBydCwgdC5jbyBhbmQgYW1wIi4gVGhlIGNsZWFuZWQgZGF0YSB3YXMgdGhlbiBmaWx0ZXJlZCBhbmQgc29ydGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhbmFseXNpcyB3ZSBjb25kdWN0ZWQuDQoNCmBgYHtyIGpvaW50X3RpbWVsaW5lc19jbGVhbmluZywgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojIEFkZGl0aW9uYWwgY2xlYW5pbmcNCg0KZ3N1YigiaHR0cFxcUyt8aHR0cHxydHx0LmNvfGFtcCIsICIiLCBqb2ludF90aW1lbGluZXMkdGV4dCkNCg0KIyBSZW1vdmluZyB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzDQoNCmpvaW50X3RpbWVsaW5lcyR0ZXh0ID0gc3RyX3JlbW92ZV9hbGwoam9pbnRfdGltZWxpbmVzJHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIikNCmBgYA0KDQoNCmBgYHtyIEJIRUtJU0lTQSBDTEVBTklORywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0JoZWtpc2lzYSBjbGVhbmluZw0KDQojIENyZWF0aW9uIG9mIGNvcnB1cw0KDQpiaGVraXNpc2FfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihiaGVraXNpc2FfdHdlZXRzJHRleHQpKSkNCg0KIyB1bi1uZXN0aW5nIHRva2Vucw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCiMgUmVvcmRlcmluZyB0d2VldCB3b3Jkcw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KIyBSZW1vdmluZyBzdG9wIHdvcmRzDQoNCmJoZWtpc2lzYV9jb3JwdXMgPC0gDQogIHRtX21hcChiaGVraXNpc2FfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCiMgUmVvcmRlcmluZyB0d2VldCB3b3Jkcw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KIyBSZW1vdmluZyBwdW5jdHVhdGlvbg0KDQpiaGVraXNpc2FfY29ycHVzIDwtIA0KICB0bV9tYXAoYmhla2lzaXNhX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCiMgUmVvcmRlcmluZyB0d2VldCB3b3Jkcw0KDQp0aWR5X2JoZWtpc2lzYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIExJTksNCmJoZWtpc2lzYV9zaGFyZWRfbGlua3MgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01vc3QgZnJlcXVlbnQgd29yZHMNCnRvcF9iaGVraXNpc2Ffd29yZHM8LQ0KICAgdGlkeV9iaGVraXNpc2FfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQojTU9TVCBMSUtFRCBUV0VFVA0KYmhla2lzaXNhX2xpa2VkX3R3ZWV0cyA8LQ0KICBiaGVraXNpc2FfdHdlZXRzJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCiNtb3N0IExpa2VkIFR3ZWV0cyBjbGVhbmluZw0KYmhla19tb3N0X2xpa2VkX3R3ZWV0cyA8LQ0KICBiaGVraXNpc2FfbGlrZWRfdHdlZXRzICU+JQ0KICBzZWxlY3QoInRleHQiKQ0KDQpCaGVrX2xpa2VfdmFsIDwtIA0KICByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICcybmQgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksIA0KICAgICAgICBjKGJoZWtfbW9zdF9saWtlZF90d2VldHMkdGV4dFsxXSwNCiAgICAgICAgICBiaGVrX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgYmhla19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIGJoZWtfbW9zdF9saWtlZF90d2VldHMkdGV4dFs0XSwNCiAgICAgICAgICBiaGVrX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KYmhla2lzaXNhX3NoYXJlZF90d2VldHMgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCiMgc2hhcmVkIHR3ZWV0IGNsZWFuaW5nDQpiaGVrX21vc3Rfc2hhcmVkX3R3ZWV0IDwtIA0KICBiaGVraXNpc2Ffc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KYmhla19zaGFyZV92YWwgPC0gDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIEJoZWtpc2lzYScpLA0KICAgICAgICBjKGJoZWtfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCg0KI1RPUCBIQVNIVEFHDQpiaGVraXNpc2FfZGZfaGFzaHRhZ3MgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIE1FTlRJT05TDQpiaGVraXNpc2FfbWVudGlvbnMgPC0gDQogIGJoZWtpc2lzYV90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKG1lbnRpb25zLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KG1lbnRpb25zLCAiXkAiKSkgJT4lIA0KICBjb3VudChtZW50aW9ucywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI1RPUCBXT1JEUw0KYmhla2lzaXNhX3dvcmRzIDwtIA0KICBiaGVraXNpc2FfdHdlZXRzICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBOSUNEIENMRUFOSU5HLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBiZWZvcmUuDQoNCm5pY2RfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihuaWNkX3R3ZWV0cyR0ZXh0KSkpDQoNCnRpZHlfbmljZF90d2VldHMgPC0gDQogIG5pY2RfdHdlZXRzICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQp0aWR5X25pY2RfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCm5pY2RfY29ycHVzIDwtIA0KICB0bV9tYXAobmljZF9jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCg0KdGlkeV9uaWNkX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpuaWNkX2NvcnB1cyA8LSANCiAgdG1fbWFwKG5pY2RfY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHJlbW92ZVB1bmN0dWF0aW9uKSkNCg0KdGlkeV9uaWNkX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYXRhKCJzdG9wX3dvcmRzIikNCg0KdG9wX25pY2Rfd29yZHM8LQ0KICAgdGlkeV9uaWNkX3R3ZWV0cyAlPiUNCiAgICAgIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgICAgICAgZmlsdGVyKCEod29yZD09Imh0dHBzInwNCiAgICAgICAgICAgICAgICAgd29yZD09InJ0InwNCiAgICAgICAgICAgICAgICAgd29yZD09InQuY28ifA0KICAgICAgICAgICAgICAgICB3b3JkPT0iYW1wIikpICU+JQ0KICAgICAgICAgICAgY291bnQod29yZCkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgTElOSw0KbmljZF9zaGFyZWRfbGlua3MgPC0gDQogIG5pY2RfdHdlZXRzICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1cmxzX2V4cGFuZGVkX3VybCkpICU+JSANCiAgY291bnQodXJsc19leHBhbmRlZF91cmwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIHRvcF9uKDUpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIFRXRUVUDQpuaWNkX3NoYXJlZF90d2VldHMgPC0NCiAgbmljZF90d2VldHMgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCiNNT1NUIExJS0VEIFRXRUVUDQpuaWNkX2xpa2VkX3R3ZWV0cyA8LQ0KICBuaWNkX3R3ZWV0cyU+JSANCiAgYXJyYW5nZSgtZmF2b3JpdGVfY291bnQpICU+JQ0KICB0b3Bfbig1LCBmYXZvcml0ZV9jb3VudCkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIGZhdm9yaXRlX2NvdW50KQ0KDQojbW9zdCBMaWtlZCBUd2VldHMgDQpuaWNkX21vc3RfbGlrZWRfdHdlZXRzIDwtIA0KICBuaWNkX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KbmljZF9saWtlX3ZhbCA8LSByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgICAgICAgICAgICAgICAgIGMobmljZF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2RfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuaWNkX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgICAgICAgICAgICAgICAgbmljZF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2RfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQoNCg0KI1RPUCBIQVNIVEFHDQpuaWNkX2RmX2hhc2h0YWdzIDwtIA0KICBuaWNkX3R3ZWV0cyAlPiUgDQogIHVubmVzdF90b2tlbnMoaGFzaHRhZywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChoYXNodGFnLCAiXiMiKSkgJT4lDQogIGNvdW50KGhhc2h0YWcsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNOSUNEIHNoYXJlZCB0d2VldCANCm5pY2RfbW9zdF9zaGFyZWRfdHdlZXQgPC0gDQogIG5pY2Rfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KbmljZF9zaGFyZV92YWwgPC0NCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgTklDRCcpLA0KICAgICAgICBjKG5pY2RfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCiNUT1AgTUVOVElPTlMNCm5pY2RfbWVudGlvbnMgPC0gDQogIG5pY2RfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgV09SRFMNCm5pY2Rfd29yZHMgPC0gDQogIG5pY2RfdHdlZXRzICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBIZWFsdGhaQSBDbGVhbmluZywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KDQojIFNhbWUgY2xlYW5pbmcgcHJvY2VzcyBhcyBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IGNsZWFuaW5nIGNodW5rDQoNCmhlYWx0aHphX2NvcnB1cyA8LSANCiAgQ29ycHVzKFZlY3RvclNvdXJjZShhcy52ZWN0b3IoaGVhbHRoemFfdHdlZXRzJHRleHQpKSkNCg0KdGlkeV9oZWFsdGh6YV90d2VldHMgPC0gDQogIGhlYWx0aHphX3R3ZWV0cyAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkNCg0KdGlkeV9oZWFsdGh6YV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KaGVhbHRoemFfY29ycHVzIDwtIA0KICB0bV9tYXAoaGVhbHRoemFfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfaGVhbHRoemFfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmhlYWx0aHphX2NvcnB1cyA8LSANCiAgdG1fbWFwKGhlYWx0aHphX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfaGVhbHRoemFfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfaGVhbHRoemFfd29yZHM8LQ0KICAgdGlkeV9oZWFsdGh6YV90d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIExJTksNCmhlYWx0aHphX3NoYXJlZF9saW5rcyA8LQ0KICBoZWFsdGh6YV90d2VldHMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgVFdFRVQNCmhlYWx0aHphX3NoYXJlZF90d2VldHMgPC0NCiAgaGVhbHRoemFfdHdlZXRzICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBMSUtFRCBUV0VFVA0KaGVhbHRoemFfbGlrZWRfdHdlZXRzIDwtDQogIGhlYWx0aHphX3R3ZWV0cyU+JSANCiAgYXJyYW5nZSgtZmF2b3JpdGVfY291bnQpICU+JQ0KICB0b3Bfbig1LCBmYXZvcml0ZV9jb3VudCkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIGZhdm9yaXRlX2NvdW50KQ0KDQpoZWFsdGh6YV9tb3N0X2xpa2VkX3R3ZWV0cyA8LQ0KICBoZWFsdGh6YV9saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCmhlYWx0aHphX2xpa2VfdmFsIDwtIA0KICByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnNHRoIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnNXRoIE1vc3QgTGlrZWQgVHdlZXQnKSwNCiAgICAgICAgYyhoZWFsdGh6YV9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgIGhlYWx0aHphX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgaGVhbHRoemFfbW9zdF9saWtlZF90d2VldHMkdGV4dFszXSwNCiAgICAgICAgICBoZWFsdGh6YV9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgIGhlYWx0aHphX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVE9QIEhBU0hUQUcNCmhlYWx0aHphX2RmX2hhc2h0YWdzIDwtIA0KICBoZWFsdGh6YV90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojTU9TVCBTSEFSRUQgVFdFRVQgDQpoZWFsdGh6YV9tb3N0X3NoYXJlZF90d2VldCA8LSANCiAgaGVhbHRoemFfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KaGVhbHRoemFfc2hhcmVfdmFsIDwtIA0KICByYmluZChjKCdNb3N0IFNoYXJlZCBUd2VldCBvZiBUaGUgRGVwYXJ0bWVudCBvZiBIZWFsdGgnKSwNCiAgICAgICAgYyhoZWFsdGh6YV9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI1RPUCBNRU5USU9OUw0KaGVhbHRoemFfbWVudGlvbnMgPC0NCiAgaGVhbHRoemFfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgV09SRFMNCmhlYWx0aHphX3dvcmRzIDwtIA0KICBoZWFsdGh6YV90d2VldHMgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKDovLykoW15cXC5dKShzPylbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCmBgYA0KDQpgYGB7ciBFV04gQ0xFQU5JTkcsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpld25yZXBvcnRlcl9jb3JwdXMgPC0gDQogIENvcnB1cyhWZWN0b3JTb3VyY2UoYXMudmVjdG9yKGV3bnJlcG9ydGVyX3R3ZWV0cyR0ZXh0KSkpDQoNCnRpZHlfZXducmVwb3J0ZXJfdHdlZXRzIDwtIA0KICBld25yZXBvcnRlcl90d2VldHMgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfZXducmVwb3J0ZXJfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmV3bnJlcG9ydGVyX2NvcnB1cyA8LSANCiAgdG1fbWFwKGV3bnJlcG9ydGVyX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KDQp0aWR5X2V3bnJlcG9ydGVyX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpld25yZXBvcnRlcl9jb3JwdXMgPC0gDQogIHRtX21hcChld25yZXBvcnRlcl9jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X2V3bnJlcG9ydGVyX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYXRhKCJzdG9wX3dvcmRzIikNCg0KI1RvcCB3b3Jkcw0KdG9wX2V3bnJlcG9ydGVyX3dvcmRzPC0NCiAgIHRpZHlfZXducmVwb3J0ZXJfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBMSU5LDQpld25yZXBvcnRlcl9zaGFyZWRfbGlua3MgPC0gDQogIGV3bnJlcG9ydGVyX3R3ZWV0cyAlPiUgDQogIGZpbHRlcighaXMubmEodXJsc19leHBhbmRlZF91cmwpKSAlPiUgDQogIGNvdW50KHVybHNfZXhwYW5kZWRfdXJsLCBzb3J0ID0gVFJVRSkgJT4lIA0KICB0b3Bfbig1KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KZXducmVwb3J0ZXJfc2hhcmVkX3R3ZWV0cyA8LSANCiAgZXducmVwb3J0ZXJfdHdlZXRzICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KZXducmVwb3J0ZXJfbW9zdF9zaGFyZWRfdHdlZXQgPC0NCiAgZXducmVwb3J0ZXJfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KZXduX3NoYXJlX3ZhbCA8LSANCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgRVdOIE5ld3MnKSwNCiAgICAgICAgYyhld25yZXBvcnRlcl9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI01PU1QgTElLRUQgVFdFRVQNCmV3bnJlcG9ydGVyX2xpa2VkX3R3ZWV0cyA8LQ0KICBld25yZXBvcnRlcl90d2VldHMlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KZXducmVwb3J0ZXJfbW9zdF9saWtlZF90d2VldHMgPC0gDQogIGV3bnJlcG9ydGVyX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KZXduX2xpa2VfdmFsIDwtDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgIGMoZXducmVwb3J0ZXJfbW9zdF9saWtlZF90d2VldHMkdGV4dFsxXSwNCiAgICAgICAgICBld25yZXBvcnRlcl9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzJdLA0KICAgICAgICAgIGV3bnJlcG9ydGVyX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgZXducmVwb3J0ZXJfbW9zdF9saWtlZF90d2VldHMkdGV4dFs0XSwNCiAgICAgICAgICBld25yZXBvcnRlcl9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzVdKSkNCg0KI1RPUCBIQVNIVEFHDQpld25yZXBvcnRlcl9kZl9oYXNodGFncyA8LSANCiAgZXducmVwb3J0ZXJfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhoYXNodGFnLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGhhc2h0YWcsICJeIyIpKSAlPiUNCiAgY291bnQoaGFzaHRhZywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI1RPUCBNRU5USU9OUw0KZXducmVwb3J0ZXJfbWVudGlvbnMgPC0gDQogIGV3bnJlcG9ydGVyX3R3ZWV0cyAlPiUgDQogIHVubmVzdF90b2tlbnMobWVudGlvbnMsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobWVudGlvbnMsICJeQCIpKSAlPiUgDQogIGNvdW50KG1lbnRpb25zLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIFdPUkRTDQpld25yZXBvcnRlcl93b3JkcyA8LSANCiAgZXducmVwb3J0ZXJfdHdlZXRzICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KHM/KShmfGh0KSh0cCkoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBORVdTMjQgQ0xFQU5JTkcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpuZXdzMjRfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihuZXdzMjRfdHdlZXRzJHRleHQpKSkNCg0KdGlkeV9uZXdzMjRfdHdlZXRzIDwtIA0KICBuZXdzMjRfdHdlZXRzICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQp0aWR5X25ld3MyNF90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KbmV3czI0X2NvcnB1cyA8LSANCiAgdG1fbWFwKG5ld3MyNF9jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCg0KdGlkeV9uZXdzMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCm5ld3MyNF9jb3JwdXMgPC0gDQogIHRtX21hcChuZXdzMjRfY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHJlbW92ZVB1bmN0dWF0aW9uKSkNCg0KdGlkeV9uZXdzMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfbmV3czI0X3dvcmRzPC0NCiAgIHRpZHlfbmV3czI0X3R3ZWV0cyAlPiUNCiAgICAgIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgICAgICAgZmlsdGVyKCEod29yZD09Imh0dHBzInwNCiAgICAgICAgICAgICAgICAgd29yZD09InJ0InwNCiAgICAgICAgICAgICAgICAgd29yZD09InQuY28ifA0KICAgICAgICAgICAgICAgICB3b3JkPT0iYW1wIikpICU+JQ0KICAgICAgICAgICAgY291bnQod29yZCkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgTElOSw0KbmV3czI0X3NoYXJlZF9saW5rcyA8LQ0KICBuZXdzMjRfdHdlZXRzICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1cmxzX2V4cGFuZGVkX3VybCkpICU+JSANCiAgY291bnQodXJsc19leHBhbmRlZF91cmwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIHRvcF9uKDUpDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIFRXRUVUDQpuZXdzMjRfc2hhcmVkX3R3ZWV0cyA8LQ0KICBuZXdzMjRfdHdlZXRzICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQpuZXdzMjRfbW9zdF9zaGFyZWRfdHdlZXQgPC0gDQogIG5ld3MyNF9zaGFyZWRfdHdlZXRzICU+JQ0KICBzZWxlY3QoInRleHQiKQ0KDQpuZXdzMjRfc2hhcmVfdmFsIDwtIA0KICByYmluZChjKCdNb3N0IFNoYXJlZCBUd2VldCBvZiBOZXdzMjQgTmV3cycpLA0KICAgICAgICBjKG5ld3MyNF9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI1RPUCBIQVNIVEFHDQpuZXdzMjRfZGZfaGFzaHRhZ3MgPC0gDQogIG5ld3MyNF90d2VldHMgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQoNCiNUT1AgTUVOVElPTlMNCm5ld3MyNF9tZW50aW9ucyA8LQ0KICBuZXdzMjRfdHdlZXRzICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNNT1NUIExJS0VEIFRXRUVUDQpuZXdzMjRfbGlrZWRfdHdlZXRzIDwtDQogIG5ld3MyNF90d2VldHMlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KbmV3czI0X21vc3RfbGlrZWRfdHdlZXRzIDwtDQogIG5ld3MyNF9saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCm5ld3MyNF9saWtlX3ZhbCA8LSANCiAgcmJpbmQoYygnMXN0IE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICczcmQgTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKG5ld3MyNF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgbmV3czI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICBuZXdzMjRfbW9zdF9saWtlZF90d2VldHMkdGV4dFszXSwNCiAgICAgICAgIG5ld3MyNF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgbmV3czI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVG9wIHdvcmRzDQpuZXdzMjRfd29yZHMgPC0gDQogIG5ld3MyNF90d2VldHMgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKHM/KSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpHb3Zlcm5tZW50WkFfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYkdGV4dCkpKQ0KDQp0aWR5X0dvdmVybm1lbnRaQV90d2VldHMgPC0gDQogIEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkNCg0KdGlkeV9Hb3Zlcm5tZW50WkFfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCkdvdmVybm1lbnRaQV9jb3JwdXMgPC0gDQogIHRtX21hcChHb3Zlcm5tZW50WkFfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfR292ZXJubWVudFpBX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpHb3Zlcm5tZW50WkFfY29ycHVzIDwtIA0KICB0bV9tYXAoR292ZXJubWVudFpBX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfR292ZXJubWVudFpBX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYXRhKCJzdG9wX3dvcmRzIikNCg0KdG9wX0dvdmVybm1lbnRaQV93b3JkczwtDQogICB0aWR5X0dvdmVybm1lbnRaQV90d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgTElOSw0KR292ZXJubWVudFpBX3NoYXJlZF9saW5rcyA8LQ0KICBHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgVFdFRVQNCkdvdmVybm1lbnRaQV9zaGFyZWRfdHdlZXRzIDwtDQogIEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiAlPiUgDQogIGFycmFuZ2UoLXJldHdlZXRfY291bnQpICU+JQ0KICBzbGljZSgxKSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgcmV0d2VldF9jb3VudCkNCg0KR292ZXJubWVudFpBX21vc3Rfc2hhcmVkX3R3ZWV0IDwtIA0KICBHb3Zlcm5tZW50WkFfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KR292WkFfc2hhcmVfdmFsIDwtDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIFNBIEdvdmVybm1lbnQgTmV3cycpLA0KICAgICAgICBjKEdvdmVybm1lbnRaQV9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI01PU1QgTElLRUQgVFdFRVQNCkdvdmVybm1lbnRaQV9saWtlZF90d2VldHMgPC0NCiAgR292ZXJubWVudFpBX3RpbWVsaW5lX2RmJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCkdvdmVybm1lbnRaQV9tb3N0X2xpa2VkX3R3ZWV0cyA8LSANCiAgR292ZXJubWVudFpBX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KR292WkFfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnNHRoIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnNXRoIE1vc3QgTGlrZWQgVHdlZXQnKSwNCiAgICAgICAgYyhHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFsxXSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFszXSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFs0XSwNCiAgICAgICAgICBHb3Zlcm5tZW50WkFfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQoNCiNUT1AgSEFTSFRBRw0KR292ZXJubWVudFpBX2RmX2hhc2h0YWdzIDwtIA0KICBHb3Zlcm5tZW50WkFfdGltZWxpbmVfZGYgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIE1FTlRJT05TDQpHb3Zlcm5tZW50WkFfbWVudGlvbnMgPC0NCiAgR292ZXJubWVudFpBX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgMTAgd29yZHMNCkdvdmVybm1lbnRaQV9kZl93b3JkcyA8LSANCiAgR292ZXJubWVudFpBX3RpbWVsaW5lX2RmICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKShzPykoOi8vKShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNURklERg0KdGlkeV9Hb3Zlcm5tZW50WkFfdGZpZGYgPC0gDQogIEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX0dvdmVybm1lbnRaQV90ZmlkZiA8LQ0KICB0aWR5X0dvdmVybm1lbnRaQV90ZmlkZiAlPiUNCiAgYXJyYW5nZShkZXNjKHRmX2lkZikpDQoNCnRvcF9Hb3Zlcm5tZW50WkFfdGZpZGYkd29yZFsxXQ0KYGBgDQoNCmBgYHtyIENMRUFOSU5HIEhFQUxUSDI0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3QgY2xlYW5pbmcgY2h1bmsNCg0KaGVhbHRoMjRfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihoZWFsdGgyNF90aW1lbGluZV9kZiR0ZXh0KSkpDQoNCnRpZHlfaGVhbHRoMjRfdHdlZXRzIDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkNCg0KdGlkeV9oZWFsdGgyNF90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KaGVhbHRoMjRfY29ycHVzIDwtIA0KICB0bV9tYXAoaGVhbHRoMjRfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfaGVhbHRoMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmhlYWx0aDI0X2NvcnB1cyA8LSANCiAgdG1fbWFwKGhlYWx0aDI0X2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfaGVhbHRoMjRfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfaGVhbHRoMjRfd29yZHM8LQ0KICAgdGlkeV9oZWFsdGgyNF90d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCg0KdGlkeV9oZWFsdGgyNF90ZmlkZjwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX2hlYWx0aDI0X3RmaWRmPC0NCiAgdGlkeV9oZWFsdGgyNF90ZmlkZiAlPiUNCiAgYXJyYW5nZShkZXNjKHRmX2lkZikpDQoNCnRvcF9oZWFsdGgyNF90ZmlkZiR3b3JkWzFdDQogDQojTU9TVCBTSEFSRUQgTElOS1MNCmhlYWx0aDI0X2RmX3NoYXJlZF9saW5rcyA8LSANCiAgaGVhbHRoMjRfdGltZWxpbmVfZGYgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgTElLRUQgVFdFRVQNCmhlYWx0aDI0X2RmX2xpa2VkX3R3ZWV0cyA8LSANCiAgaGVhbHRoMjRfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCmhlYWx0aDI0X21vc3RfbGlrZWRfdHdlZXRzIDwtDQogIGhlYWx0aDI0X2RmX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KaGVhbHRoMjRfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKGhlYWx0aDI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgaGVhbHRoMjRfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICBoZWFsdGgyNF9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIGhlYWx0aDI0X21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgaGVhbHRoMjRfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQoNCg0KI1RPUCBIQVNIVEFHDQpoZWFsdGgyNF9kZl9oYXNodGFncyA8LSANCiAgaGVhbHRoMjRfdGltZWxpbmVfZGYgJT4lIA0KICB1bm5lc3RfdG9rZW5zKGhhc2h0YWcsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaGFzaHRhZywgIl4jIikpICU+JQ0KICBjb3VudChoYXNodGFnLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KDQpoZWFsdGgyNF9kZl9zaGFyZWRfdHdlZXRzIDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUgDQogIGFycmFuZ2UoLXJldHdlZXRfY291bnQpICU+JQ0KICBzbGljZSgxKSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgcmV0d2VldF9jb3VudCkNCg0KaGVhbHRoMjRfbW9zdF9zaGFyZWRfdHdlZXQgPC0gDQogIGhlYWx0aDI0X2RmX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCmhlYWx0aDI0X3NoYXJlX3ZhbCA8LSANCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgSGVhbHRoMjQnKSwNCiAgYyhoZWFsdGgyNF9tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KIyB0b3AgbWVudGlvbnMNCg0KaGVhbHRoMjRfZGZfbWVudGlvbnMgPC0gDQogIGhlYWx0aDI0X3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiMgdG9wIHdvcmRzDQoNCmhlYWx0aDI0X2RmX3dvcmRzIDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAlPiUNCiAgbXV0YXRlKHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiJmFtcDt8Jmx0O3wmZ3Q7IiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiXFxzPyhmfGh0KShzPykoOi8vKSh0cCkoW15cXC5dKVtcXC58L10oXFxTKSIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlteXHgwMS1ceDdGXSIpKSAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAidHdlZXRzIikgJT4lDQogIGZpbHRlcighd29yZCAlaW4lIHN0b3Bfd29yZHMkd29yZCwNCiAgIXdvcmQgJWluJSBzdHJfcmVtb3ZlX2FsbChzdG9wX3dvcmRzJHdvcmQsICInIiksDQogIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIiksDQogICFzdHJfZGV0ZWN0KHdvcmQsICJeIyIpLCANCiAgIXN0cl9kZXRlY3Qod29yZCwgIkBcXFMrIikpICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQpgYGANCg0KYGBge3IgU0Fnb3ZuZXdzIENMRUFOSU5HLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3QgY2xlYW5pbmcgY2h1bmsNCg0KU0Fnb3ZuZXdzX2NvcnB1cyA8LSANCiAgQ29ycHVzKFZlY3RvclNvdXJjZShhcy52ZWN0b3IoU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmJHRleHQpKSkNCg0KdGlkeV9TQWdvdm5ld3NfdHdlZXRzIDwtIA0KICBTQWdvdm5ld3NfdGltZWxpbmVfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfU0Fnb3ZuZXdzX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpTQWdvdm5ld3NfY29ycHVzIDwtIA0KICB0bV9tYXAoU0Fnb3ZuZXdzX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KDQp0aWR5X1NBZ292bmV3c190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KU0Fnb3ZuZXdzX2NvcnB1cyA8LSANCiAgdG1fbWFwKFNBZ292bmV3c19jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X1NBZ292bmV3c190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCnRvcF9TQWdvdm5ld3Nfd29yZHM8LQ0KICAgdGlkeV9TQWdvdm5ld3NfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQoNCnRpZHlfU0Fnb3ZuZXdzX3RmaWRmPC0gDQogIFNBZ292bmV3c190aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX1NBZ292bmV3c190ZmlkZjwtDQogIHRpZHlfU0Fnb3ZuZXdzX3RmaWRmICU+JQ0KICBhcnJhbmdlKGRlc2ModGZfaWRmKSkNCg0KdG9wX1NBZ292bmV3c190ZmlkZiR3b3JkWzFdDQoNCiNNT1NUIFNIQVJFRCBMSU5LUw0KU0Fnb3ZuZXdzX2RmX3NoYXJlZF9saW5rcyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1cmxzX2V4cGFuZGVkX3VybCkpICU+JSANCiAgY291bnQodXJsc19leHBhbmRlZF91cmwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIHRvcF9uKDUpDQoNCiNNT1NUIFNIQVJFRCBUV0VFVFMNClNBZ292bmV3c19kZl9zaGFyZWRfdHdlZXRzIDwtIA0KICBTQWdvdm5ld3NfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNClNBZ292bmV3c19tb3N0X3NoYXJlZF90d2VldCA8LSANCiAgU0Fnb3ZuZXdzX2RmX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNClNBZ292bmV3c19zaGFyZV92YWwgPC0gDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIFNBIEdvdmVybm1lbnQgTmV3cycpLA0KICAgICAgICBjKFNBZ292bmV3c19tb3N0X3NoYXJlZF90d2VldCR0ZXh0KSkNCg0KI01PU1QgTElLRUQgVFdFRVRTDQpTQWdvdm5ld3NfZGZfbGlrZWRfdHdlZXRzIDwtIA0KICBTQWdvdm5ld3NfdGltZWxpbmVfZGYlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzIDwtDQogIFNBZ292bmV3c19kZl9saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNClNBZ292bmV3c19saWtlX3ZhbCA8LQ0KICByYmluZChjKCcxc3QgTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICcybmQgTW9zdCBMaWtlZCBUd2VldCcsDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgIGMoU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgU0Fnb3ZuZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVE9QIEhBU1RBR1MNClNBZ292bmV3c19kZl9oYXNodGFncyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhoYXNodGFnLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGhhc2h0YWcsICJeIyIpKSAlPiUNCiAgY291bnQoaGFzaHRhZywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI01PU1QgTUVOVElPTlMNClNBZ292bmV3c19kZl9tZW50aW9ucyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNUT1AgV09SRFMNClNBZ292bmV3c19kZl93b3JkcyA8LSANCiAgU0Fnb3ZuZXdzX3RpbWVsaW5lX2RmICU+JQ0KICBtdXRhdGUodGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICImYW1wO3wmbHQ7fCZndDsiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJcXHM/KGZ8aHQpKHRwKSg6Ly8pKHM/KShbXlxcLl0pW1xcLnwvXShcXFMpIiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiW15ceDAxLVx4N0ZdIikpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJ0d2VldHMiKSAlPiUNCiAgZmlsdGVyKCF3b3JkICVpbiUgc3RvcF93b3JkcyR3b3JkLA0KICAhd29yZCAlaW4lIHN0cl9yZW1vdmVfYWxsKHN0b3Bfd29yZHMkd29yZCwgIiciKSwNCiAgc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSwNCiAgIXN0cl9kZXRlY3Qod29yZCwgIl4jIiksIA0KICAhc3RyX2RldGVjdCh3b3JkLCAiQFxcUysiKSkgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmBgYA0KDQpgYGB7ciBjbGVhbl9zYWJjX2RhdGEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCg0KIyBTYW1lIGNsZWFuaW5nIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBjbGVhbmluZyBjaHVuaw0KDQpzYWJjX25ld3NfY29ycHVzIDwtIA0KICBDb3JwdXMoVmVjdG9yU291cmNlKGFzLnZlY3RvcihzYWJjX25ld3NfdGltZWxpbmVfZGYkdGV4dCkpKQ0KDQp0aWR5X3NhYmNfdHdlZXRzIDwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfc2FiY190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0Kc2FiY19uZXdzX2NvcnB1cyA8LSANCiAgdG1fbWFwKHNhYmNfbmV3c19jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkNCg0KdGlkeV9zYWJjX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpzYWJjX25ld3NfY29ycHVzIDwtIA0KICB0bV9tYXAoc2FiY19uZXdzX2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVQdW5jdHVhdGlvbikpDQoNCnRpZHlfc2FiY190d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCnRvcF9zYWJjX3dvcmRzPC0NCiAgIHRpZHlfc2FiY190d2VldHMgJT4lDQogICAgICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lDQogICAgICAgIGZpbHRlcighKHdvcmQ9PSJodHRwcyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJydCJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJ0LmNvInwNCiAgICAgICAgICAgICAgICAgd29yZD09ImFtcCIpKSAlPiUNCiAgICAgICAgICAgIGNvdW50KHdvcmQpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MobikpDQoNCnRpZHlfc2FiY190ZmlkZjwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgICB1bm5lc3RfdG9rZW5zKCJ3b3JkIiwgdGV4dCkgJT4lDQogICAgICAgIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUNCiAgICAgICAgICAgY291bnQod29yZCwgY3JlYXRlZF9hdCkgJT4lDQogICAgICAgICAgICAgIGJpbmRfdGZfaWRmKHdvcmQsIGNyZWF0ZWRfYXQsIG4pDQoNCnRvcF9zYWJjX3RmaWRmPC0NCiAgdGlkeV9zYWJjX3RmaWRmICU+JQ0KICBhcnJhbmdlKGRlc2ModGZfaWRmKSkNCg0KdG9wX3NhYmNfdGZpZGYkd29yZFsxXQ0KDQoNCiNNT1NUIEZSRVFVRU5UTFkgU0hBUkVEIExJTktTDQpzYWJjX25ld3Nfc2hhcmVkX2xpbmtzIDwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVybHNfZXhwYW5kZWRfdXJsKSkgJT4lIA0KICBjb3VudCh1cmxzX2V4cGFuZGVkX3VybCwgc29ydCA9IFRSVUUpICU+JSANCiAgdG9wX24oNSkNCg0KI01PU1QgRlJFUVVFTlRMWSBTSEFSRUQgVFdFRVRTDQpzYWJjX25ld3Nfc2hhcmVkX3R3ZWV0cyA8LSANCiAgc2FiY19uZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVA0KDQpzYWJjX25ld3NfZGZfc2hhcmVkX3R3ZWV0cyA8LSANCiAgc2FiY19uZXdzX3RpbWVsaW5lX2RmICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQpzYWJjX25ld3NfbW9zdF9zaGFyZWRfdHdlZXQgPC0NCiAgc2FiY19uZXdzX2RmX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCnNhYmNfc2hhcmVfdmFsIDwtIA0KICByYmluZChjKCdNb3N0IFNoYXJlZCBUd2VldCBvZiBTQUJDIE5ld3MnKSwNCiAgICAgICAgYyhzYWJjX25ld3NfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCiNNT1NUIExJS0VEIFRXRUVUUw0Kc2FiY19uZXdzX2xpa2VkX3R3ZWV0cyA8LSANCiAgc2FiY19uZXdzX3RpbWVsaW5lX2RmJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCiNNT1NUIExJS0VEIFRXRUVUDQpzYWJjX25ld3NfZGZfbGlrZWRfdHdlZXRzIDwtIA0KICBzYWJjX25ld3NfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1mYXZvcml0ZV9jb3VudCkgJT4lDQogIHRvcF9uKDUsIGZhdm9yaXRlX2NvdW50KSAlPiUgDQogIHNlbGVjdChjcmVhdGVkX2F0LCBzY3JlZW5fbmFtZSwgdGV4dCwgZmF2b3JpdGVfY291bnQpDQoNCnNhYmNfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyA8LQ0KICBzYWJjX25ld3NfZGZfbGlrZWRfdHdlZXRzICU+JQ0KICBzZWxlY3QoInRleHQiKQ0KDQpzYWJjX2xpa2VfdmFsIDwtDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzJuZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzNyZCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzR0aCBNb3N0IExpa2VkIFR3ZWV0JywgDQogICAgICAgICAgJzV0aCBNb3N0IExpa2VkIFR3ZWV0JyksDQogICAgICAgIGMoc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMl0sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbM10sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgc2FiY19uZXdzX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNV0pKQ0KDQojVE9QIEhBU0hUQUdTDQpzYWJjX25ld3NfaGFzaHRhZ3MgPC0gDQogIHNhYmNfbmV3c190aW1lbGluZV9kZiAlPiUgDQogIHVubmVzdF90b2tlbnMoaGFzaHRhZywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChoYXNodGFnLCAiXiMiKSkgJT4lDQogIGNvdW50KGhhc2h0YWcsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCiNTQUJDTmV3cyBzaGFyZWQgdHdlZXQgQ2xlYW5pbmcNClNBQkNfbmV3c19tb3N0X3NoYXJlZF90d2VldCA8LQ0KICBzYWJjX25ld3Nfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0Kc2FiY19zaGFyZV92YWwgPC0NCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgU0FCQyBOZXdzJyksDQogICAgICAgIGMoU0FCQ19uZXdzX21vc3Rfc2hhcmVkX3R3ZWV0JHRleHQpKQ0KDQojVE9QIE1FTlRJT05TDQpzYWJjX25ld3NfbWVudGlvbnMgPC0gDQogIHNhYmNfbmV3c190aW1lbGluZV9kZiAlPiUgDQogIHVubmVzdF90b2tlbnMobWVudGlvbnMsIHRleHQsICJ0d2VldHMiLCB0b19sb3dlciA9IEZBTFNFKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobWVudGlvbnMsICJeQCIpKSAlPiUgDQogIGNvdW50KG1lbnRpb25zLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQojVE9QIFdPUkRTDQpzYWJjX25ld3Nfd29yZHMgPC0gDQogIHNhYmNfbmV3c190aW1lbGluZV9kZiAlPiUNCiAgbXV0YXRlKHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiJmFtcDt8Jmx0O3wmZ3Q7IiksDQogIHRleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiXFxzPyhmfGh0KShzPykoOi8vKSh0cCkoW15cXC5dKVtcXC58L10oXFxTKSIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlteXHgwMS1ceDdGXSIpKSAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAidHdlZXRzIikgJT4lDQogIGZpbHRlcighd29yZCAlaW4lIHN0b3Bfd29yZHMkd29yZCwNCiAgIXdvcmQgJWluJSBzdHJfcmVtb3ZlX2FsbChzdG9wX3dvcmRzJHdvcmQsICInIiksDQogIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIiksDQogICFzdHJfZGV0ZWN0KHdvcmQsICJeIyIpLCANCiAgIXN0cl9kZXRlY3Qod29yZCwgIkBcXFMrIikpICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lDQogIHRvcF9uKDEwKQ0KDQpgYGANCg0KYGBge3IgZU5DQSBDTEVBTklORywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KDQojIFNhbWUgY2xlYW5pbmcgcHJvY2VzcyBhcyBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IGNsZWFuaW5nIGNodW5rDQoNCmVuY2FfbmV3c19jb3JwdXMgPC0gDQogIENvcnB1cyhWZWN0b3JTb3VyY2UoYXMudmVjdG9yKGVuY2FfdGltZWxpbmVfZGYkdGV4dCkpKQ0KDQp0aWR5X2VuY2FfdHdlZXRzIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQp0aWR5X2VuY2FfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmVuY2FfbmV3c19jb3JwdXMgPC0gDQogIHRtX21hcChlbmNhX25ld3NfY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpDQoNCnRpZHlfZW5jYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZW5jYV9uZXdzX2NvcnB1cyA8LSANCiAgdG1fbWFwKGVuY2FfbmV3c19jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X2VuY2FfdHdlZXRzICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpDQoNCmRhdGEoInN0b3Bfd29yZHMiKQ0KDQp0b3BfZW5jYV93b3JkczwtDQogICB0aWR5X2VuY2FfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQp0aWR5X2VuY2FfdGZpZGY8LSANCiAgZW5jYV90aW1lbGluZV9kZiAlPiUNCiAgICBzZWxlY3QoY3JlYXRlZF9hdCx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBjcmVhdGVkX2F0KSAlPiUNCiAgICAgICAgICAgICAgYmluZF90Zl9pZGYod29yZCwgY3JlYXRlZF9hdCwgbikNCg0KdG9wX2VuY2FfdGZpZGY8LQ0KICB0aWR5X2VuY2FfdGZpZGYgJT4lDQogIGFycmFuZ2UoZGVzYyh0Zl9pZGYpKQ0KDQp0b3BfZW5jYV90ZmlkZiR3b3JkWzFdDQoNCiNNT1NUIFNIQVJFRCBMSU5LUw0KZW5jYV9uZXdzX3NoYXJlZF9saW5rcyA8LSANCiAgZW5jYV90aW1lbGluZV9kZiAlPiUgDQogIGZpbHRlcighaXMubmEodXJsc19leHBhbmRlZF91cmwpKSAlPiUgDQogIGNvdW50KHVybHNfZXhwYW5kZWRfdXJsLCBzb3J0ID0gVFJVRSkgJT4lIA0KICB0b3Bfbig1KQ0KDQojVE9QIFNIQVJFRCBUV0VFVFMNCmVuY2FfbmV3c19zaGFyZWRfdHdlZXRzIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JSANCiAgYXJyYW5nZSgtcmV0d2VldF9jb3VudCkgJT4lDQogIHNsaWNlKDEpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCByZXR3ZWV0X2NvdW50KQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVFMNCg0KZW5jYV9uZXdzX3NoYXJlZF90d2VldHMgPC0gDQogIGVuY2FfdGltZWxpbmVfZGYgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCmVuY2FfbmV3c19tb3N0X3NoYXJlZF90d2VldCA8LQ0KICBlbmNhX25ld3Nfc2hhcmVkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KZW5jYV9zaGFyZV92YWwgPC0gDQogIHJiaW5kKGMoJ01vc3QgU2hhcmVkIFR3ZWV0IG9mIGVOQ0EnKSwNCiAgICAgICAgYyhlbmNhX25ld3NfbW9zdF9zaGFyZWRfdHdlZXQkdGV4dCkpDQoNCiNNT1NUIExJS0VEIFRXRUVUUw0KZW5jYV9uZXdzX2xpa2VkX3R3ZWV0cyA8LSANCiAgZW5jYV90aW1lbGluZV9kZiU+JSANCiAgYXJyYW5nZSgtZmF2b3JpdGVfY291bnQpICU+JQ0KICB0b3Bfbig1LCBmYXZvcml0ZV9jb3VudCkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIGZhdm9yaXRlX2NvdW50KQ0KDQplbmNhX25ld3NfbW9zdF9saWtlZF90d2VldHMgPC0gDQogIGVuY2FfbmV3c19saWtlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCmVuY2FfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzFdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzJdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzRdLA0KICAgICAgICAgIGVuY2FfbmV3c19tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzVdKSkNCg0KI1RPUCBIQVNIVEFHUw0KZW5jYV9uZXdzX2hhc2h0YWdzIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhoYXNodGFnLCB0ZXh0LCAidHdlZXRzIiwgdG9fbG93ZXIgPSBGQUxTRSkgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGhhc2h0YWcsICJeIyIpKSAlPiUNCiAgY291bnQoaGFzaHRhZywgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI1RvcCB3b3JkcyBwbG90DQplbmNhX25ld3Nfd29yZHMgPC0gDQogIGVuY2FfdGltZWxpbmVfZGYgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8ocz8pKGZ8aHQpKHRwKSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KI01FTlRJT05TIA0KZW5jYV9uZXdzX21lbnRpb25zIDwtIA0KICBlbmNhX3RpbWVsaW5lX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCg0KYGBgDQoNCmBgYHtyIGNsZWFuX2FsbF9tZWRpYV9kYXRhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQoNCiMgU2FtZSBjbGVhbmluZyBwcm9jZXNzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3QgY2xlYW5pbmcgY2h1bmsNCg0KIyMgSm9pbmluZyBhbGwgdGVuIG1lZGlhIHNvdXJjZXMgVHdpdHRlciBkYXRhDQoNCmNvbXBsZXRlX2RhdGFfc291cmNlX2RmIDwtDQogIGJoZWtpc2lzYV90d2VldHMgJT4lDQogIGZ1bGxfam9pbihld25yZXBvcnRlcl90d2VldHMpICU+JQ0KICBmdWxsX2pvaW4oR292ZXJubWVudFpBX3RpbWVsaW5lX2RmKSAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aHphX3R3ZWV0cykgJT4lDQogIGZ1bGxfam9pbihuZXdzMjRfdHdlZXRzKSAlPiUNCiAgZnVsbF9qb2luKG5pY2RfdHdlZXRzKSAlPiUNCiAgZnVsbF9qb2luKHNhYmNfbmV3c190aW1lbGluZV9kZikgJT4lDQogIGZ1bGxfam9pbihlbmNhX3RpbWVsaW5lX2RmKSAlPiUNCiAgZnVsbF9qb2luKFNBZ292bmV3c190aW1lbGluZV9kZikgJT4lDQogIGZ1bGxfam9pbihoZWFsdGgyNF90aW1lbGluZV9kZikNCg0KYWxsX21lZGlhX2NvcnB1cyA8LSANCiAgQ29ycHVzKFZlY3RvclNvdXJjZQ0KICAgICAgICAgKGFzLnZlY3Rvcg0KICAgICAgICAgIChjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZiR0ZXh0KSkpDQoNCnRpZHlfYWxsX21lZGlhX3R3ZWV0cyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lDQogICAgc2VsZWN0KGNyZWF0ZWRfYXQsdGV4dCkgJT4lDQogICAgdW5uZXN0X3Rva2Vucygid29yZCIsIHRleHQpDQoNCnRpZHlfYWxsX21lZGlhX3R3ZWV0cyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKQ0KDQphbGxfbWVkaWFfY29ycHVzIDwtIA0KICB0bV9tYXAoYWxsX21lZGlhX2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygiZW5nbGlzaCIpKQ0KDQp0aWR5X2FsbF9tZWRpYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KYWxsX21lZGlhX2NvcnB1cyA8LSANCiAgdG1fbWFwKGFsbF9tZWRpYV9jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlUHVuY3R1YXRpb24pKQ0KDQp0aWR5X2FsbF9tZWRpYV90d2VldHMgJT4lDQogIGNvdW50KHdvcmQpICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KZGF0YSgic3RvcF93b3JkcyIpDQoNCnRvcF9hbGxfbWVkaWFfd29yZHM8LQ0KICAgdGlkeV9hbGxfbWVkaWFfdHdlZXRzICU+JQ0KICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICBmaWx0ZXIoISh3b3JkPT0iaHR0cHMifA0KICAgICAgICAgICAgICAgICB3b3JkPT0icnQifA0KICAgICAgICAgICAgICAgICB3b3JkPT0idC5jbyJ8DQogICAgICAgICAgICAgICAgIHdvcmQ9PSJhbXAiKSkgJT4lDQogICAgICAgICAgICBjb3VudCh3b3JkKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQojTU9TVCBGUkVRVUVOVExZIFNIQVJFRCBUV0VFVFMNCg0KbWVkaWFfc2hhcmVkX3R3ZWV0cyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lIA0KICBhcnJhbmdlKC1yZXR3ZWV0X2NvdW50KSAlPiUNCiAgc2xpY2UoMSkgJT4lIA0KICBzZWxlY3QoY3JlYXRlZF9hdCwgc2NyZWVuX25hbWUsIHRleHQsIHJldHdlZXRfY291bnQpDQoNCm1lZGlhX21vc3Rfc2hhcmVkX3R3ZWV0IDwtDQogIG1lZGlhX3NoYXJlZF90d2VldHMgJT4lDQogIHNlbGVjdCgidGV4dCIpDQoNCm1lZGlhX3NoYXJlX3ZhbCA8LSANCiAgcmJpbmQoYygnTW9zdCBTaGFyZWQgVHdlZXQgb2YgYWxsIG1lZGlhJyksDQogICAgICAgIGMoZW5jYV9uZXdzX21vc3Rfc2hhcmVkX3R3ZWV0JHRleHQpKQ0KDQojTU9TVCBMSUtFRCBUV0VFVFMNCm1lZGlhX2xpa2VkX3R3ZWV0cyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYlPiUgDQogIGFycmFuZ2UoLWZhdm9yaXRlX2NvdW50KSAlPiUNCiAgdG9wX24oNSwgZmF2b3JpdGVfY291bnQpICU+JSANCiAgc2VsZWN0KGNyZWF0ZWRfYXQsIHNjcmVlbl9uYW1lLCB0ZXh0LCBmYXZvcml0ZV9jb3VudCkNCg0KbWVkaWFfbW9zdF9saWtlZF90d2VldHMgPC0gDQogIG1lZGlhX2xpa2VkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJ0ZXh0IikNCg0KbWVkaWFfbGlrZV92YWwgPC0gDQogIHJiaW5kKGMoJzFzdCBNb3N0IExpa2VkIFR3ZWV0JywNCiAgICAgICAgICAnMm5kIE1vc3QgTGlrZWQgVHdlZXQnLCANCiAgICAgICAgICAnM3JkIE1vc3QgTGlrZWQgVHdlZXQnLA0KICAgICAgICAgICc0dGggTW9zdCBMaWtlZCBUd2VldCcsIA0KICAgICAgICAgICc1dGggTW9zdCBMaWtlZCBUd2VldCcpLA0KICAgICAgICBjKG1lZGlhX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbMV0sDQogICAgICAgICAgbWVkaWFfbW9zdF9saWtlZF90d2VldHMkdGV4dFsyXSwNCiAgICAgICAgICBtZWRpYV9tb3N0X2xpa2VkX3R3ZWV0cyR0ZXh0WzNdLA0KICAgICAgICAgIG1lZGlhX21vc3RfbGlrZWRfdHdlZXRzJHRleHRbNF0sDQogICAgICAgICAgbWVkaWFfbW9zdF9saWtlZF90d2VldHMkdGV4dFs1XSkpDQpgYGANCg0KIyBSZXBvcnQgUmVzdWx0czoNCg0KIyMgTWluaW11bSBSZXF1aXJlbWVudHM6DQoNCg0KIyMgQkhFS0lTSVNBIChAQmhla2lzaXNhX01HKQ0KDQoNCkJoZWtpc2lzYSBpcyBhbiBpbmRlcGVuZGVudCBDZW50cmUgZm9yIEhlYWx0aCBKb3VybmFsaXNtLiBUaGUgaW5mb3JtYXRpb24gY29udmV5ZWQgdGhyb3VnaCB0aGVtIGlzIHVzZWQgYW5kIHB1Ymxpc2hlZCBieSBudW1lcm91cyBvdGhlciBhY2NyZWRpdGVkIG5ld3Mgc291cmNlcyBhbmQgbWVkaWEgYWdlbnRzLiBUaGUgQ09WSUQtMTkgdmlydXMgaXMgYSBwYW5kZW1pYywgd2hpY2ggY29uY2VybnMgdGhlIGhlYWx0aGNhcmUgc2VjdG9yIG9mIFNvdXRoIEFmcmljYSBhcyBhIHdob2xlLCB0aGUgcm9sZSBvZiBCaGVraXNpc2EgYXMgYW4gaW5mb3JtYXRpdmUgcGxhdGZvcm0gc2VlbXMgaW1wZXJhdGl2ZSB3aXRoaW4gdGhpcyBjb250ZXh0Lg0KDQpgYGB7ciBCaGVrIFBMT1RTLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI0JoZWtpc2lzYSBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QoYmhla2lzaXNhX3R3ZWV0cywgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBCaGVraXNpc2EgVHdlZXRzIiwgDQogICAgICAgY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpICsNCiAgeGxhYihOVUxMKQ0KYGBgDQpJbiB0aGUgbGFzdCBtb250aCwgdGhlcmUgaGFzIG5vdCBiZWVuIGFueSBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZSBmcmVxdWVuY3kgb2YgdHdlZXRzIA0KYnkgQmhla2lzaXNhLiBFeGNlcHQgZm9yIGEgcmFwaWQgc3Bpa2UgYXQgdGhlIGVuZCBvZiBKdW5lLCB3aGljaCBjb3VsZCBoYXZlIGEgY29ycmVsYXRpb24gdG8gdGhlIENvdmlkLTE5IHRoaXJkIHdhdmUuDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpiaGVrX2ZpZzEgPC0gDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCwgNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IExpa2VkIFR3ZWV0czwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBCaGVrX2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KYmhla19maWcxDQoNCmBgYA0KMXN0IG1vc3QgbGlrZWQgdHdlZXQgb2YgQmhla2lzaXNhIHdhcyBhIHR3ZWV0IGNvbmNlcm5pbmcgYSBDb3ZpZCAtMTkgd2ViaW5hciBob3N0ZWQgYnkgQmhla2lzaXNhLCB3aXRoIHRoZSBob3N0IGJlaW5nIHRoZWlyIEVkaXRvci1pbi1jaGllZiwgTWlhIE1hbGFuLiAybmQgTW9zdCBsaWtlZCB0d2VldCBpcyBhIHR3ZWV0IGNvbmNlcm5pbmcgdGhlIGluZHVjdGlvbiBvZiBhIG5ldyB0eXBlIG9mIEFUTSBtYWNoaW5lLCB3aGljaCBpcyBub3QgcmVsZXZhbnQgdG8gdGhpcyByZXBvcnQuIDNyZCBiZWluZyBhIHR3ZWV0IG1lbnRpb25pbmcgdGhlIEJoZWtpc2lzYSBob3N0ZWQgd2ViaW5hciByZWdhcmRpbmcgdGhlIENvdmlkIHBhbmRlbWljIHdpdGggYSBzZWN0aW9uIG1lbnRpb25pbmcgY292aWQgdmFjY2luYXRpb24gc2l0ZXMuIFRoZSA0dGggbW9zdCBsaWtlZCB0d2VldCBjb252ZXllZCBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIG5hdGlvbmFsIENvdmlkIHN0YXRpc3RpY3MgYW5kIHRoZSA1dGggZGVzY3JpYmVkIHRoZSBzaXR1YXRpb24gcmVnYXJkaW5nIEpvaG5zb24gJiBKb2huc29uIHZhY2NpbmF0aW9ucyBmb3IgdGVhY2hlcnMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNIYXNodGFnIHBsb3QNCmdncGxvdChiaGVraXNpc2FfZGZfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gQmhla2lzaXNhIFR3ZWV0cyIpDQpgYGANClRvcCBoYXNodGFncyBvZiBCaGVraXNpc2EgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTlTQeKAmSwgMi4g4oCYI0NPVklEMTnigJksIDMuIOKAmCNCaGVraXNpc2FSZXNvdXJjZeKAmSwgNC4g4oCYI3ZhY2NpbmXigJksIDUuIOKAmCNWYWNjaW5lUm9sbG91dFNB4oCZIDYuIOKAmCNDT1ZJRDE5aW5TQeKAmSwgNy4g4oCYI1BmaXplcuKAmSwgOC4g4oCYI0puSuKAmSA5LiDigJgjQ09WSUTigJksIDEwLiDigJgjdmFjY2luZXPigJkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgcGxvdA0KYmhla19maWcgPC0gDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI4MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXQ8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gYmhla19zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpiaGVrX2ZpZyANCmBgYA0KVGhlIG1vc3Qgc2hhcmVkIHR3ZWV0IGJ5IEJoZWtpc2lzYSBpcyBhIHR3ZWV0IGNvbmNlcm5pbmcgYWJvcnRpb24gYWN0aXZpc20sIGFuZCBhcyBzdWNoIGNhbiBiZSBkZWVtZWQgaW5zaWduaWZpY2FudC4gDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KGJoZWtpc2lzYV9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gQmhla2lzaXNhIFR3ZWV0cyIpDQpgYGANClRoZSB0b3AgbWVudGlvbiBvZiBAQmhla2lzaXNhX01HIGlzIHRoYXQgb2YgYSBCaGVraXNpc2EgcmVwb3J0ZXIgbmFtZWQgSm9hbiB2YW4gRHlrIChAdmFuZHlram9hbiksIHNlY29uZCBiZWluZyDigJhAbWlhbWFsYW7igJkuIFRoZSAzcmQgYW5kIDR0aCByZWZlcnJpbmcgdG8gUHJvZmVzc29yIEFiZG9vbCBLYXJpbSwgd2hvIGNhbiBiZSB2aWV3ZWQgYXMgdGhlIGZhY2Ugb2YgQ292aWQgcmVsYXRlZCBzY2llbmNlIGluIFNvdXRoIEFmcmljYS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCB3b3JkcyBwbG90DQpnZ3Bsb3QoYmhla2lzaXNhX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluIEJoZWtpc2lzYSBUd2VldHMiKQ0KDQpgYGANClRvcCB3b3JkcyBncmFwaDoNCuKAmHZhY2NpbmXigJkgd2FzIHRoZSBmb3VydGggbW9zdCBwcm9taW5lbnQgd29yZCBmb2xsb3dlZCBieSDigJhqYWLigJkgYXQgNXRoIHBsYWNlLiBUaGUgZmlyc3QgbW9zdCBmcmVxdWVudGx5IHVzZWQgd29yZCB3aXRoaW4gdGhlIEJoZWtpc2lzYSB0d2VldHMgd2FzIOKAmGFyY2hpdmXigJksIGFzIHRoZSBCaGVraXNpc2EgVHdpdHRlciBhY2NvdW50IHVzZXMgdGhlIHdvcmQgdG8gcmVmZXIgdG8gdGhlaXIgb3duIHJlc291cmNlIHBvb2wgd2l0aCB3aGljaCB0aGVpciBmb2xsb3dlcnMgY2FuIGludGVyYWN0IHdpdGguIFRoZSBzZWNvbmQgYW5kIHRoaXJkIHdvcmRzLCDigJhwZW9wbGXigJkgYW5kIOKAmHNvdXRo4oCZIGFyZSBkZWVtZWQgaW5zaWduaWZpY2FudC4NCg0KDQojIyBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQ29tbXVuaWNhYmxlIERpc2Vhc2VzIChAbmljZF9zYSkNCg0KDQpUaGUgTmF0aW9uYWwgSW5zdGl0dXRlIGZvciBDb21tdW5pY2FibGUgRGlzZWFzZXMgKE5JQ0QpIGlzIGEgU291dGggQWZyaWNhbiBOYXRpb25hbCBwdWJsaWMgaGVhbHRoIGluc3RpdHV0ZS4gSXRz4oCZIGFjdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlIFNvdXRoIEFmcmljYW4gZ292ZXJubWVudCwgcmVmbGVjdGluZyBtZWFucyBvZiByZXNwb25zZSwgbW9uaXRvcmluZywgdHJhaW5pbmcsIGRpYWdub3N0aWNzLCBhbmQgcmVzZWFyY2ggb2YgY29tbXVuaWNhYmxlIGRpc2Vhc2VzLiBPbmUgb2YgaXRzIG1haW4gcHVycG9zZXMgYmVpbmcgb3V0YnJlYWsgcmVzcG9uc2UgYW5kIHN1cnZlaWxsYW5jZS4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQojTklDRCBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QobmljZF90d2VldHMsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgTklDRCBUd2VldHMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikgKw0KICB4bGFiKE5VTEwpDQoNCmBgYA0KVGltZSBzZXJpZXMgc2hvd2luZyB0aGUgZnJlcXVlbmN5IG9mIE5JQ0QgdHdlZXRzIG92ZXIgdGltZSBpbmRpY2F0ZXMgdGhhdCBvbiBhdmVyYWdlIG1vcmUgdGhhbiA5MCB0d2VldHMgYXJlIG1hZGUgcGVyIHdlZWsgZXhjZXB0IGZvciBKdW5lIDI3IHdoZXJlIGxlc3MgdGhhbiA5MCB0d2VldHMgd2VyZSBtYWRlLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpuaWNkX2ZpZzEgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBMaWtlZCBUd2VldHM8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gbmljZF9saWtlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCm5pY2RfZmlnMQ0KYGBgDQpOSUNE4oCZcyBtb3N0IGxpa2VkIHR3ZWV0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgaW5pdGlhbCBvdXRicmVhayBvZiB0aGUgU0FSUy1Db1YtMiB2aXJ1cywgYWxzbyByZWZlcnJlZCB0byBhcyBjb3ZpZC0xOS4gVGhlIDJuZCBtb3N0IGxpa2VkIHR3ZWV0IGZyb20gdGhlIE5JQ0QgYWNjb3VudCBpcyBhIHR3ZWV0IHByYWlzaW5nIFNB4oCZcyBmcm9udGxpbmUgaGVhbHRoIHdvcmtlcnMgaW4gdGhlIHN0cnVnZ2xlIGFnYWluc3QgdGhlIENvdmlkLTE5IG91dGJyZWFrLiBUaGUgdGhpcmQgbW9zdCBsaWtlZCB0d2VldCBpcyBhIHR3ZWV0IHNpZ25hbGxpbmcgdGhlIGVhcmx5IGluY3JlYXNlIG9mIGNvbmZpcm1lZCBjYXNlcyB3aXRoaW4gU291dGggQWZyaWNhLiBUaGUgZm91cnRoIG1vc3QgbGlrZWQgdHdlZXQgaW5kaWNhdGVzIHRoZSBjb25maXJtZWQgY2FzZXMgd2l0aGluIFNvdXRoIEFmcmljYSByZWFjaGluZyAxNTA1LiBUaGUgNXRoIG1vc3QgbGlrZWQgdHdlZXQgaXMgYW5vdGhlciBpbmZvcm1hdGl2ZSB0d2VldCBvbiB0aGUgZ3Jvd2luZyBudW1iZXIgb2YgY29uZmlybWVkIGNhc2VzIGluIFNvdXRoIEFmcmljYS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0hhc2h0YWcgcGxvdA0KZ2dwbG90KG5pY2RfZGZfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gTklDRCBUd2VldHMiKQ0KYGBgDQpUb3AgaGFzaHRhZ3MgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTnigJksIDIuIOKAmCNGaWdodENPVklEMTnigJksIDMuIOKAmCNTdGF5U2FmZeKAmSwgNC4g4oCYI0NPVklEMTlTdXJ2ZWlsbGFuY2XigJksIDUuIOKAmCNGbGF0dGVuVGhlQ3VydmXigJkgNi4g4oCYI1N0YXlBdEhvbWXigJksIDcuIOKAmCNTcHJlYWRUaGVGYWN0c+KAmSwgOC4g4oCYI2Nvcm9uYXZpcnVz4oCZIDkuIOKAmCNUaXNUaGVTZWFzb25Ub0JlU2FmZeKAmSwgMTAuIOKAmCNTdGF5QXRob21l4oCZLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IHNoYXJlZCBwbG90DQpuaWNkX2ZpZyA8LSBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyODAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IEZyZXF1ZW50bHkgU2hhcmVkIFR3ZWV0PC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IG5pY2Rfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KbmljZF9maWcNCmBgYA0KVGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJpc2luZyBjb25maXJtZWQgY2FzZXMgb2YgQ09WSUQtMTksIGF0IDQwMiBjb25maXJtZWQgY2FzZXMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KG5pY2RfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gTklDRCBUd2VldHMiKQ0KYGBgDQpUaGUgTklDRCBpcyBhIG1ham9yIHByb3ZpZGVyIG9mIG5hdGlvbmFsIGhlYWx0aCBpbmZvcm1hdGlvbiB3aXRoIOKAmEBIZWFsdGhaQeKAmSAoU0EgRGVwYXJ0bWVudCBvZiBIZWFsdGgpIGJlaW5nIHRoZSBtb3N0IGZyZXF1ZW50IG1lbnRpb24gd2l0aGluIHRoZWlyIHR3ZWV0cy4gRm9sbG93ZWQgYnkg4oCYIEBuaWNkc2HigJkgYW5kIOKAmEBEclp3ZWxpTWtoaXpl4oCZLCB0aGUgTmF0aW9uYWwgTWluaXN0ZXIgb2YgSGVhbHRoLCBhdCB0aGUgdGltZS4gVGhlIOKAmEBXSE/igJkgYW5kIOKAmEBTQUhQUkEx4oCZLCB0d28gc2lnbmlmaWNhbnQgQ292aWQtMTkgcmVsYXRlZCBpbnN0aXR1dGVzLCBvbmUgYmVpbmcgbmF0aW9uYWwgYW5kIHRoZSBvdGhlciBpbnRlcm5hdGlvbmFsLiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVG9wIHdvcmRzIHBsb3QNCmdncGxvdChuaWNkX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gTklDRCBUd2VldHMiKQ0KDQpgYGANClRoZSBtb3N0IGZyZXF1ZW50IHdvcmQgd2l0aGluIE5JQ0QgdHdlZXRzIGlzIOKAmHRvdGFs4oCZLCBmb2xsb3dlZCBieSDigJhkZWF0aOKAmSBhbmQg4oCYdXBkYXRl4oCZLiBUaGlzIGNvdWxkIGJlIGFuIGluZGljYXRpb24gb2YgQ09WSUQgc3RhdGlzdGljcyBiZWluZyByZWxlYXNlZCBieSB0aGUgTklDRCBwbGF0Zm9ybS4gVGhlIGZvdXJ0aCBhbmQgZmlmdGggd29yZHMgYXJlIOKAmHNhZmXigJkgYW5kIOKAmHRlc3Rz4oCZLiANCg0KIyMgU291dGggQWZyaWNhbiBEZXBhcnRtZW50IG9mIEhlYWx0aCAoQEhlYWx0aFpBKQ0KDQoNClRoZSBTb3V0aCBBZnJpY2FuIERlcGFydG1lbnQgb2YgSGVhbHRoIGlzIGFuIG9yZ2FuaXphdGlvbmFsIHNlY3RvciB3aXRoaW4gdGhlIFNvdXRoIEFmcmljYW4gZ292ZXJubWVudCBjb25jZXJuZWQgd2l0aCBhbGwgYXNwZWN0cyBvZiBuYXRpb25hbCBoZWFsdGguIFRoZSBleGVjdXRpdmUgZGVwYXJ0bWVudCBjb25zaXN0cyBvZiBzZXZlcmFsIGNvbW1pdHRlZXMgYW5kIGNvdW5jaWxzIGFsbCB3aXRoIHRoZSBtYWluIGdvYWwgb2YgaW5jcmVhc2luZyB0aGUgaGVhbHRoIHN0YXR1cyBvZiB0aGUgU291dGggQWZyaWNhbiBjaXRpemVuLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI0hlYWx0aFpBIFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChoZWFsdGh6YV90d2VldHMsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgSGVhbHRoWkEgVHdlZXRzIiwNCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikgKw0KICB4bGFiKE5VTEwpDQpgYGANClRoZSBmcmVxdWVuY3kgb2YgSGVhbHRoWkEgdHdlZXRzIGRvIG5vdCBzaG93Y2FzZSBhbnkgbm90ZXdvcnRoeSBpbmZvcm1hdGlvbi4gDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpoZWFsdGh6YV9maWcxIDwtDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGhlYWx0aHphX2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KaGVhbHRoemFfZmlnMQ0KYGBgDQoxc3QgTW9zdCBsaWtlZCBUd2VldCBpcyB0aGF0IG9mIGEgbWVzc2FnZSBmcm9tIFNB4oCZcyBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbm5vdW5jaW5nIHRoYXQgdGhlcmUgYXJlIHJlY292ZXJpZXMgYW1vbmcgcmVwb3J0ZWQgQ292aWQtMTkgY2FzZXMuIFRoZSAybmQgcmVmZXJyaW5nIHRvIGludGVybmF0aW9uYWwgaGVscCBpbiBTQeKAmXMgQ09WSUQtMTkgY2F1c2UsIGVzcGVjaWFsbHkgdGhhdCBvZiBDdWJhbiBtZWRpY2FsIHN0YWZmLiBUaGUgM3JkIHR3ZWV0IGluZm9ybWluZyB0aGUgcHVibGljIG9uIGRldGFpbHMgYWJvdXQgdGhlIHNlY29uZCByZXBvcnRlZCBjb3ZpZC1yZWxhdGVkIGRlYXRoIGluIFNBLiBUaGUgNHRoIGdpdmluZyBhbiB1cGRhdGUgb24gY29uZmlybWVkIGFuZCByZWNvdmVyZWQgY2FzZXMsIGZvbGxvd2VkIGJ5IHRoZSA1dGggd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIHNwcmVhZCBvZiBDb3ZpZCB0aHJvdWdoIHNvY2lhbCBpbnRlcmFjdGlvbnMuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0hhc2h0YWcgcGxvdA0KZ2dwbG90KGhlYWx0aHphX2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIERlcGFydG1lbnQgb2YgSGVhbHRoIFR3ZWV0cyIpDQpgYGANClRvcCBoYXNodGFncyBhcmUgc3RydWN0dXJlZCBhcyBmb2xsb3dzOiAxLiDigJgjQ09WSUQxOeKAmSwgMi4g4oCYI0Nvcm9uYVZpcnVzU0HigJksIDMuIOKAmCNDb3JvbmFWaXJ1c1VwZGF0ZeKAmSwgNC4g4oCYI0NvdmlkMTnigJksIDUuIOKAmCNDb3JvbmF2aXJ1c1NB4oCZIDYuIOKAmCNWYWNjaW5lUm9sbG91dFNB4oCZLCA3LiDigJgjQ29yb25hVmlydXPigJksIDguIOKAmCNTdGF5U2FmZeKAmSA5LiDigJgjY29yb25hdmlydXPigJksIDEwLiDigJgjQ2VsZWJyYXRlU2FmZeKAmS4NCg0KYGBge3IgIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3Qgc2hhcmVkIHR3ZWV0IHBsb3QNCmhlYWx0aHphX2ZpZyA8LSANCiAgcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBoZWFsdGh6YV9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpoZWFsdGh6YV9maWcNCmBgYA0KVGhlIERlcGFydG1lbnQgb2YgSGVhbHRo4oCZcyBtb3N0IHNoYXJlZCB0d2VldCBpcyBhbiBhbm5vdW5jZW1lbnQgdGVsbGluZyBjaXRpemVucyB3aG8gd2VyZSBwYXJ0IG9mIGNlcnRhaW4gY3J1aXNlIHRyaXBzIHRvIGNvbnRhY3QgdGhlIGRlcGFydG1lbnQgYXMgc29vbiBhcyBwb3NzaWJsZS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCBtZW50aW9ucw0KZ2dwbG90KGhlYWx0aHphX21lbnRpb25zLCBhZXMoeCA9IHJlb3JkZXIobWVudGlvbnMsIG4pLCB5ID0gbikpICsNCiAgICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIE1lbnRpb25zIGluIERlcGFydG1lbnQgb2YgSGVhbHRoIFR3ZWV0cyIpDQpgYGANCuKAmEBHYXV0ZW5nSGVhbHRo4oCZIGlzIGFtb25nIHRoZSB0b3AgZml2ZSBtZW50aW9ucyBvZiBIZWFsdGhaQSB0d2VldHMsIHRoaXMgaXMgcmVmZXJyaW5nIHRvIHRoZSBjdXJyZW50IHNldmVyaXR5IG9mIHRoZSBsb2NrZG93biB3aXRoaW4gdGhlIHByb3ZpbmNlLiBBbW9uZyB0aG9zZSBpbiB0aGUgdG9wIDEwIG1lbnRpb25zIGFyZSwg4oCYQEN5cmlsUmFtYXBob3Nh4oCZLCDigJhATVJDemHigJksIOKAmEBVTklDRUZTQeKAmSwgQG5pY2RzYeKAmSwg4oCYQFdIT1NvdXRoQWZyaWNh4oCZIGFuZCDigJhAV2VzdENhcGVIZWFsdGjigJkuIEFsbCB0aGVzZSBtZW50aW9ucyBjYW4gYmUgcmVsYXRlZCB0byB0aGUgQ292aWQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3Agd29yZHMgUGxvdA0KZ2dwbG90KGhlYWx0aHphX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gRGVwYXJ0bWVudCBvZiBIZWFsdGggVHdlZXRzIikNCiAgDQpgYGANClRoZSBtb3N0IGZyZXF1ZW50IHdvcmQgaXMg4oCYc291dGjigJkgZm9sbG93ZWQgYnkg4oCYYWZyaWNh4oCZLiBUaGUgbG9naWNhbCByZWFzb25pbmcgZm9yIHRoaXMgd291bGQgYmUgdGhhdCBtb3N0IHR3ZWV0cyB3b3VsZCBjb250YWluIHRoZXNlIHR3byB0ZXJtcyBhcyB0aGUgYWNjb3VudCBob2xkZXIgaXMgdGhlIE5hdGlvbmFsIERlcGFydG1lbnQgb2YgSGVhbHRoLiBUaGUgM3JkIHRlcm0gaXMg4oCYdG90YWzigJkgZm9sbG93ZWQgYnkg4oCYZGVhdGhz4oCZLCBhcyBjb3ZpZCBzdGF0aXN0aWNzIGFyZSByZWxlYXNlZCB0aHJvdWdoIHRoaXMgY2hhbm5lbC4gVGhlIDV0aCBtb3N0IGZyZXF1ZW50IHdvcmQgaXMg4oCYY292aWQxOeKAmSBhbmQgdGhlIDh0aCBpcyDigJh0ZXN0c+KAmS4gDQoNCiMjIEV5ZSBXaXRuZXNzIE5ld3MgKEBld25yZXBvcnRlcikNCg0KDQpFeWUgV2l0bmVzcyBOZXdzIGlzIGEgU291dGggQWZyaWNhbiBuZXdzIGFnZW5jeSBjb3ZlcmluZyBtZWRpYSBvbiBhIGJyb2FkIGJhc2Ugb2YgYXBwbGljYWJsZSBpbmR1c3RyaWVzIGFuZCBzZWN0b3JzLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQojRVdOIFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChld25yZXBvcnRlcl90d2VldHMsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgRVdOIFR3ZWV0cyIsDQogICAgICAgY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpICsNCiAgeGxhYihOVUxMKQ0KYGBgDQpUaW1lIHNlcmllcyBvZiB0aGUgZnJlcXVlbmN5IG9mIHR3ZWV0cyBieSBFV04gaW5kaWNhdGVzIHRoYXQgb24gYXZlcmFnZSB0aGUgYWNjb3VudCB0d2VldHMgaW4gYSB2b2xhdGlsZSBtYW5uZXIuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpld25yZXBvcnRlcl9maWcxIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGV3bl9saWtlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmV3bnJlcG9ydGVyX2ZpZzENCmBgYA0KTm9uZSBvZiB0aGUgbW9zdCBsaWtlZCB0d2VldHMgb2YgdGhlIEVXTiBUd2l0dGVyIGFjY291bnQgYXJlIHJlbGF0ZWQgdG8gQ09WSUQgYW5kIGFzIHN1Y2ggaXMgZGVlbWVkIGlycmVsZXZhbnQuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNIYXNodGFnIHBsb3QNCmdncGxvdChld25yZXBvcnRlcl9kZl9oYXNodGFncywgYWVzKHggPSByZW9yZGVyKGhhc2h0YWcsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBIYXNodGFncyBpbiBFV04gVHdlZXRzIikNCmBgYA0KVG9wIGhhc2h0YWdzIGFyZSBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3M6IDEuIOKAmCNDT1ZJRDE54oCZLCAyLiDigJgjRmlnaHRDT1ZJRDE54oCZLCAzLiDigJgjU3RheVNhZmXigJksIDQuIOKAmCNDT1ZJRDE5U3VydmVpbGxhbmNl4oCZLCA1LiDigJgjRmxhdHRlblRoZUN1cnZl4oCZIDYuIOKAmCNTdGF5QXRIb21l4oCZLCA3LiDigJgjU3ByZWFkVGhlRmFjdHPigJksIDguIOKAmCNjb3JvbmF2aXJ1c+KAmSA5LiDigJgjU3RheUF0aG9tZeKAmSwgMTAuIOKAmCNUaXNUaGVTZWFzb25Ub0JlU2FmZeKAmS4NCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBmcmVxdWVudGx5IHNoYXJlZA0KZXducmVwb3J0ZXJfZmlnIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI4MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXQ8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gZXduX3NoYXJlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmV3bnJlcG9ydGVyX2ZpZw0KYGBgDQpUaGUgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBvZiBOZXdzMjQgaXMgdW5yZWxhdGVkIHRvIGNvdmlkLTE5Lg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMNCmdncGxvdChld25yZXBvcnRlcl9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogICAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBNZW50aW9ucyBpbiBFV04gVHdlZXRzIikNCmBgYA0KVGhlIHRvcCBtZW50aW9ucyBpbiBFV04gdHdlZXRzIGFyZSB1bnJlbGF0ZWQgdG8gQ292aWQtMTkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCB3b3Jkcw0KZ2dwbG90KGV3bnJlcG9ydGVyX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gRVdOIFR3ZWV0cyIpDQoNCmBgYA0KTW9zdCBmcmVxdWVudGx5IHdvcmRzIGluIEVXTiBuZXdzIHR3ZWV0cyBhcmUg4oCYcG9saWNl4oCZLCDigJhwZW9wbGXigJksIOKAmGNhcGXigJksIGZvbGxvd2VkIHdpdGgg4oCYY292aWQxOeKAmSBpbiB0aGUgNHRoIHBvc2l0aW9uIGFuZCDigJhoZWFsdGjigJkgaW4gNXRoLiANCg0KIyMgTkVXUzI0IChATmV3czI0KQ0KDQoNCk5ld3MyNCBpcyBvbiBvZiBTb3V0aCBBZnJpY2HigJlzIG1vc3QgcHJvbWluZW50IG9ubGluZSBuZXdzIHBsYXRmb3JtcyBhbmQgd2FzIGxhdW5jaGVkIGluIDIwMDcuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI05ld3MyNCBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QobmV3czI0X3R3ZWV0cywgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBOZXdzMjQgVHdlZXRzIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKSArDQogIHhsYWIoTlVMTCkNCmBgYA0KVGhlcmUgYXJlIG5vIHNpZ25pZmljYW50IHBlYWtzIG9yIGxvdyBwb2ludHMgTmV3czI0IHR3ZWV0cy4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNCm5ld3MyNF9maWcxIDwtIA0KICBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyNTAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IExpa2VkIFR3ZWV0czwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBuZXdzMjRfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpuZXdzMjRfZmlnMQ0KYGBgDQpUaGUgbW9zdCBsaWtlZCB0d2VldCBpcyB1bnJlbGF0ZWQgdG8gQ09WSUQtMTksIGluY2x1ZGluZyB0aGUgMm5kLCAzcmQsNHRoIGFuZCA1dGguIA0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojSGFzaHRhZyBwbG90DQpnZ3Bsb3QobmV3czI0X2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIE5ld3MyNCBUd2VldHMiKQ0KYGBgDQpUb3AgaGFzaHRhZ3MgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTnigJksIDIuIOKAmCNGaWdodENPVklEMTnigJksIDMuIOKAmCNTdGF5U2FmZeKAmSwgNC4g4oCYI0NPVklEMTlTdXJ2ZWlsbGFuY2XigJksIDUuIOKAmCNGbGF0dGVuVGhlQ3VydmXigJkgNi4g4oCYI1N0YXlBdEhvbWXigJksIDcuIOKAmCNTcHJlYWRUaGVGYWN0c+KAmSwgOC4g4oCYI2Nvcm9uYXZpcnVz4oCZIDkuIOKAmCNTdGF5QXRob21l4oCZLCAxMC4g4oCYI1Rpc1RoZVNlYXNvblRvQmVTYWZl4oCZLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IHNoYXJlZCB0d2VldHMgcGxvdA0KbmV3czI0X2ZpZyA8LQ0KICBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyNTAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IEZyZXF1ZW50bHkgU2hhcmVkIFR3ZWV0PC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IG5ld3MyNF9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpuZXdzMjRfZmlnDQpgYGANClRoZSBtb3N0IGZyZXF1ZW50bHkgc2hhcmVkIHR3ZWV0IG9mIE5ld3MyNCBpcyB1bnJlbGF0ZWQgdG8gY292aWQtMTkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCBtZW50aW9ucyANCmdncGxvdChuZXdzMjRfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gTmV3czI0IFR3ZWV0cyIpDQpgYGANClRvcCBtZW50aW9uIGJlaW5nIOKAmEBIZWFsdGhaQeKAmSwgdGhlIFNvdXRoIEFmcmljYW4gRGVwYXJ0bWVudCBvZiBIZWFsdGgsIGZvbGxvd2VkIGJ5IOKAmEBuaWNkc2HigJkgYW5kIOKAmEBEclp3ZWxpTWtoaXpl4oCZLCB0aGUgU291dGggQWZyaWNhbiBNaW5pc3RlciBvZiBIZWFsdGguIFRoZSBXb3JsZCBIZWFsdGggT3JnYW5pc2F0aW9uIChAV0hPKSBhbmQgU0FIUFJBIChAU0FIUFJBMSksIHdoaWNoIGlzIGEgYnJhbmNoIG9mIHRoZSBTb3V0aCBBZnJpY2FuIERlcGFydG1lbnQgb2YgSGVhbHRoIHRhc2tlZCB3aXRoIHRoZSByZWd1bGF0aW9uIG9mIGFsbCBoZWFsdGggLXJlbGF0ZWQgcHJvZHVjdHMgYW5kIGNsaW5pY2FsIHRyaWFscyBpbiBTQSwgYXJlIHdpdGhpbiB0aGUgdG9wIDEwIG9mIHRoZXNlIG1lbnRpb25zLg0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVG9wIHdvcmRzDQpnZ3Bsb3QobmV3czI0X3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpICsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluIE5ld3MyNCBUd2VldHMiKQ0KDQpgYGANCk1vc3QgZnJlcXVlbmx5IHVzZWQgd29yZCB3aXRoaW4gTmV3czI0IHR3ZWV0cyBpcyDigJhjb3ZpZDE54oCZLCBmb2xsb3dlZCBieSBtb3JlIGlycmVsZXZhbnQgd29yZHMgc3VjaCBhcyDigJhzb3V0aOKAmSwg4oCYY2FwZeKAmSBhbmQg4oCYY291cnTigJkuDQoNCiMjIFNBQkMgTmV3cyAoQFNBQkNOZXdzKQ0KDQpUaGUgU0FCQyBOZXdzIGFjY291bnQgd2FzIGNob3NlbiBiZWNhdXNlIGl0IGlzIHRoZSBvZmZpY2lhbCBUd2l0dGVyLWJhc2VkIGRpZ2l0YWwgcGxhdGZvcm0gdXNlZCBieSB0aGUgU291dGggQWZyaWNhbiBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24sIHdoaWNoIGlzIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGFuZCByZXB1dGFibGUgbmV3cyBtZWRpYSBzb3VyY2VzIGluIFNvdXRoIEFmcmljYS4gDQoNCmBgYHtyIFNBQkNfTmV3cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQoNCiNTQUJDIFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChzYWJjX25ld3NfdGltZWxpbmVfZGYsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgU0FCQyBOZXdzIFR3ZWV0cyIsDQogICAgICAgY2FwdGlvbj0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikgKw0KICB4bGFiKE5VTEwpDQpgYGANClRoZSBTQUJDIE5ld3MgdGltZS1zZXJpZXMgZ3JhcGggc2hvd3MgdGhhdCB0aGUgU0FCQyB0d2l0dGVyIGFjY291bnQgdHdlZXRzIG9uIGF2ZXJhZ2UgbW9yZSB0aGFuIDQwIHR3ZWV0cyBhIGRheSBmb3IgdGhlIHBhc3QgbW9udGgsIGV4Y2VwdCBmb3IgdGhlIDE0dGggSnVuZSBhbmQgNHRoIEp1bHkgMjAyMSB3aGVyZSB0aGUgYXZlcmFnZSB3YXMgbGVzcyB0aGFuIDQwLiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBsaWtlZCBUd2VldHMgUGxvdA0Kc2FiY19maWcxIDwtDQogIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IHNhYmNfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpzYWJjX2ZpZzENCmBgYA0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgbGlrZWQgdHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSB0b3AgZml2ZSBtb3N0IGxpa2VkIHR3ZWV0cyBjb3ZlciB0aGUgZm9sbG93aW5nIHRvcGljcyAoaW4gZGVzY2VuZGluZyBvcmRlcik6IFRoZSBwb2xpdGljYWwgdW5yZXN0IGluIEVzd2F0aW5pLCB0aGUgY29uc3RpdHV0aW9uYWwgY291cnQgc2VudGVuY2luZyBmb3JtZXIgUHJlc2lkZW50IEphY29iIFp1bWEgdG8gMTUgbW9udGhzIGltcHJpc29ubWVudCBmb3IgY29udGVtcHQgb2YgY291cnQsIHRoZSBOYXRpb25hbCBMaXF1b3IgVHJhZGVycyBDb3VuY2lsIHN0YXRlcyB0aGF0IHNvbWUgbWVtYmVycyB2b3cgdG8gZGVmeSB0aGUgYmFuIG9uIGFsY29ob2wgc2FsZXMsIHRoZSBzYW1lIGFzIHRoZSBzZWNvbmQgdHdlZXQgbWVudGlvbmVkIGFuZCwgbGFzdGx5LCB0aGF0IHRoZSBmb3JtZXIgRXNrb20gYm9hcmQgY2hhaXIsIEphYnUgTWFidXphLCBoYXMgcGFzc2VkIGEgd2F5IGR1ZSB0byBDT1ZJRC0xOS4gRnJvbSB0aGVzZSB0b3AgZml2ZSB0d2VldHMgb25seSB0d28gcGVydGFpbiB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUT1AgSEFTSFRBR1MNCmdncGxvdChzYWJjX25ld3NfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pLCBjb2xvciA9IGhhc2h0YWcpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikgKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gU0FCQyBOZXdzIFR3ZWV0cyIpDQpgYGANClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIHRlbiBoYXNodGFncyBvZiBTQUJDIE5ld3MgVHdlZXRzIGZvciB0aGUgcGFzdCAzMjAwIHR3ZWV0cywgaW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBoYXNodGFncyBhcmUgdGhlIG1vc3QgcHJldmFsZW50LiDigJwjU0FCQ05ld3PigJ0sIOKAnCNFVVJPMjAyMOKAnSwg4oCcI0lDWU1J4oCdLCDigJwjQ09WSUQxOeKAnSwg4oCcI0phY29iIFp1bWHigJ0sIOKAnCNTQUJDV2VhdGhlcuKAnSwg4oCcI0V1cm8yMDIw4oCdLCDigJwjU3RhdGVDYXB0dXJlSW5xdWlyeeKAnSwg4oCcI2Nvcm9uYXZpcnVz4oCdLCBhbmQg4oCcI0NPVklEMTlTQeKAnS4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXRzDQpzYWJjX2ZpZyA8LSBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyODAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IEZyZXF1ZW50bHkgU2hhcmVkIFR3ZWV0PC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IHNhYmNfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0Kc2FiY19maWcNCmBgYA0KDQpUaGUgdGFibGUgc2hvd2luZyB0aGUgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBmcm9tIFNBQkMgTmV3cyBpcyBhYm91dCB0aGUgcG9saXRpY2FsIHVucmVzdCBpbiBFc3dhdGluaSBhbmQgZG9lcyBub3QgZGlyZWN0bHkgcGVydGFpbiB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMNCmdncGxvdChzYWJjX25ld3NfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIE1lbnRpb25zIGluIFNBQkMgTmV3cyBUd2VldHMiKQ0KYGBgDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCBtZW50aW9ucyBpbiBTQUJDIE5ld3MgVHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSBtb3N0IGZyZXF1ZW50IG1lbnRpb25zIGFyZSDigJxAMTJIMDDigJ0sIOKAnEBZb3VUdWJl4oCdLCDigJxAMTdIMDDigJ0sIOKAnEAxOEgwMOKAnSwg4oCcQFBvZ2JhTm8xZmFu4oCdLCDigJxAVGhlV2F0Y2hkb2dTQUJD4oCdIGFuZCDigJxAdnV5b212b2tv4oCdLiBUaGUgbWVudGlvbnMgZG8gbm90IHByb3ZpZGUgYW55IGluc2lnaHQgYWJvdXQgdGhlIENPVklELTE5IHBhbmRlbWljLiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVG9wIHdvcmRzIHBsb3QNCmdncGxvdChzYWJjX25ld3Nfd29yZHMsIGFlcyh4ID0gcmVvcmRlcih3b3JkLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgV29yZHMgaW4gU0FCQyBuZXdzIFR3ZWV0cyIpDQoNCmBgYA0KVGhlIGJhciBjaGFydCBzaG93aW5nIHRoZSB0b3AgdGVuIHdvcmRzIHVzZWQgaW4gU0FCQyBOZXdzIFR3ZWV0cyBpbmRpY2F0ZSB0aGF0IHRoZSB0b3AgdGVuIHdvcmRzIGFyZSDigJxjb3ZpZDE54oCdLCDigJxzb3V0aOKAnSwg4oCccHJlc2lkZW504oCdLCDigJxBZnJpY2HigJ0sIOKAnGNvdXJ04oCdLCDigJxBZnJpY2Fu4oCdLCDigJxoZWFsdGjigJ0sIOKAnHBlb3BsZeKAnSwg4oCcbWluaXN0ZXLigJ0gYW5kIOKAnHZpZGVv4oCdIGFyZSB0aGVpciB0b3Agd29yZHMuIFRoZSBjaGFydCBpbmRpY2F0ZXMgdGhhdCB0aGUgdG9wIHdvcmQgaXMg4oCcY292aWQxOeKAnSB3aGljaCBhcHBlYXJzIGluIG1vcmUgdGhhbiAyMDAgdHdlZXRzLiANCg0KIyMgZU5DQSAoQGVOQ0EpDQoNClRoZSBlTkNBIGFjY291bnQgd2FzIGNob3NlbiBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gdGhlIGVOQ0EgMjQtaG91ciBuZXdzIGNoYW5uZWwgdGhhdCBwcmVzZW50cyBuZXdzIGFib3V0IFNvdXRoIEFmcmljYSBhbmQgQWZyaWNhLiBUaGUgYWNjb3VudCBqb2luZWQgaW4gTWF5IDIwMTEuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KDQojZU5DQSBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QoZW5jYV90aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBlTkNBIFR3ZWV0cyIsIA0KICAgICAgIGNhcHRpb24gPSAiVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBlTkNBIHRpbWUgc2VyaWVzIGdyYXBoIHNob3dzIHRoYXQgZU5DQSB0d2VldHMgbW9yZSB0aGFuIDUwIHR3ZWV0cyBhIGRheSBvdmVyIHRoZSBwYXN0IG1vbnRoIGV4Y2VwdCBmb3IgdGhlIHdlZWsgYmVmb3JlIHRoZSA3dGggSnVuZSAyMDIxLCB3aGVyZSB0aGVyZSB3ZXJlIGZldyB0byB6ZXJvIHR3ZWV0cy4gDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgZnJlcXVlbnRseSBzaGFyZWQgcGxvdA0KZW5jYV9uZXdzX2ZpZyA8LSANCiAgcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBlbmNhX3NoYXJlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmVuY2FfbmV3c19maWcNCmBgYA0KDQpUaGUgdGFibGUgc2hvd2luZyB0aGUgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBhcyBvZiBKdWx5IDIwMjEgaXMgcmVnYXJkaW5nIHRoZSBkZWF0aCBvZiBhIE5pZ2VyaWFuIHRlbGV2YW5nZWxpc3QgVEIgSm9zaHVhLg0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVE9QIEhBU0hUQUdTIFBMT1QNCmdncGxvdChlbmNhX25ld3NfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pLCBjb2xvciA9IGhhc2h0YWcpICsNCmdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gZU5DQSBUd2VldHMiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIGhhc2h0YWdzIGluIGVOQ0EgdHdlZXRzIGluZGljYXRlcyB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJwjRFN0djQwM+KAnSwg4oCcI2VOQ0HigJ0sIOKAnCNDT1ZJRDE54oCdLCDigJwjZU5DQXPigJ0sIOKAnCNTb3V0aEFmcmljYW5Nb3JuaW5n4oCdLCDigJwjTmV3c0xpbmvigJ0sIOKAnCNTb3V0aEFmcmljYVRvbmlnaHTigJ0sIOKAnCNQcm9wZXJ0eU1hdHRlcnPigJ0sIOKAnCNBbGxBbmdsZXPigJ0sIOKAnCNUaGVNaWRkYXlWaWV34oCdIGFuZCDigJwjVGhlTGVhZOKAnSBhcmUgdGhlaXIgdG9wIGhhc2h0YWdzLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgcmFua3MgdGhpcmQgaW4gZU5DQeKAmXMgdG9wIGhhc2h0YWdzLCB3aGlsZSB0aGUgcmVzdCBvZiB0aGUgaGFzaHRhZ3MgcmVmZXIgdG8gZWl0aGVyIGVOQ0EgdGhlbXNlbGYgb3IgdGhlIHJlc3BlY3RpdmUgcHJvZ3JhbW1lcyBvbiB0aGVpciB0ZWxldmlzaW9uIGNoYW5uZWwgIChEU1RWNDAzKS4NCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBsaWtlZCBUd2VldHMgUGxvdA0KZW5jYV9uZXdzX2ZpZzEgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBMaWtlZCBUd2VldHM8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gZW5jYV9saWtlX3ZhbCwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSBjKCcjZjhmNGZmJywgJ3doaXRlJykpLA0KICAgIGFsaWduID0gYygnbGVmdCcsICdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9IGMoJyM1MDY3ODQnKSwgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSAzMA0KICAgICkpDQoNCmVuY2FfbmV3c19maWcxDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgbGlrZWQgdHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSB0b3AgZml2ZSBtb3N0IGxpa2VkIHR3ZWV0cyBvZiBlTkNBIGFyZSAoaW4gZGVzY2VuZGluZyBvcmRlcikgYSBuZXdzIHJlcG9ydCBvZiB0aGUgZGVhdGggb2YgVEIgSm9zaHVhLCBuZXdzIHJlcG9ydCBvZiBadW1hIHN1cHBvcnRlcnMgZGVmeWluZyBsb2NrZG93biByZWd1bGF0aW9ucywgbmV3cyByZXBvcnQgb2YgUHJlc2lkZW50IEN5cmlsIFJhbWFwaG9zYeKAmXMgYWRkcmVzcyB0byB0aGUgbmF0aW9uIGFuZCBuaWdodCwgYSBuZXdzIHJlcG9ydCBvZiBmb3JtZXIgUHJlc2lkZW50IFp1bWEgYmVpbmcgc2VudGVuY2VkIHRvIDE1ICBtb250aHMgaW1wcmlzb25tZW50IGFuZCBhbm90aGVyICByZXBvcnQgb2YgdGhlIHNhbWUgdGhpbmcuICANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojVE9QIE1FTlRJT05TIHBsb3QNCmdncGxvdChlbmNhX25ld3NfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIE1lbnRpb25zIGluIGVOQ0EgVHdlZXRzIikNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCBtZW50aW9ucyBpbiBlTkNBIHR3ZWV0cyBpbmRpY2F0ZXMgdGhhdCAoaW4gZGVzY2VuZGluZyBvcmRlcikg4oCcQFNhbGx5QnVyZGV0dFNB4oCdLCDigJxAQWJzYVNvdXRoQWZyaWNhLCDigJxARmFpdGhNYW5nb3Bl4oCdLCDigJxAQmV0dGVyQm9uZFNB4oCdLCDigJxAR2FyZXRoRWR3YXJkc1NB4oCdLCDigJxAQUJ3YW5ha2F3YeKAnSwg4oCcQFNpcGhhbWFuZGxhR29nZeKAnSwg4oCcQFRoZVJlYWxDbGVtZW50TeKAnSwg4oCcQE1hc2Vnb1JhaGxhZ2HigJ0gYW5kIOKAnEByZXZ1ZeKAnSBhcmUgdGhlIHRvcCBtZW50aW9ucyBpbiB0aGVpciB0d2VldHMuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RPUCAxMCB3b3Jkcw0KZ2dwbG90KGVuY2FfbmV3c193b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBXb3JkcyBpbiBlTkNBIFR3ZWV0cyIpDQoNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCB3b3JkcyBpbiBlTkNBIHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJxjb3ZpZDE54oCdLCDigJxzb3V0aOKAnSwg4oCccHJlc2lkZW504oCdLCDigJxBZnJpY2HigJ0sIOKAnGNvdXJ04oCdLCDigJxBZnJpY2Fu4oCdLCDigJxoZWFsdGjigJ0sIOKAnHBlb3BsZeKAnSwg4oCcbWluaXN0ZXLigJ0gYW5kIOKAnHZpZGVv4oCdIGFyZSB0aGUgdG9wIHdvcmRzIHVzZWQgaW4gdGhlaXIgdHdlZXRzLiBGcm9tIHRoaXMgZmlndXJlLCBpdCBpcyBpbmRpY2F0ZWQgdGhhdCB0aGUgdGVybSDigJxjb3ZpZDE54oCdIGlzIHRoZSBtb3N0IHByZXZhbGVudCB0ZXJtIGluIHRoZSBlTkNBIHR3ZWV0cyBjb2xsZWN0ZWQuIA0KDQojIyBTb3V0aCBBZnJpY2FuIEdvdmVybm1lbnQgKEBHb3Zlcm5tZW50WkEpDQoNClRoZSBTb3V0aCBBZnJpY2FuIEdvdmVybm1lbnQgYWNjb3VudCB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgaXMgYW4gb2ZmaWNpYWwgYWNjb3VudCBvZiB0aGUgZ292ZXJubWVudCwgcHJvdmlkaW5nIGFjY3VyYXRlIGFuZCB0cnVzdHdvcnRoeSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIENPVklELTE5IHBhbmRlbWljIGFuZCBsb2NrZG93biByZWd1bGF0aW9ucy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KI0dvdmVybm1lbnRaQSBUaW1lbGluZSBGcmVxdWVuY3kgDQp0c19wbG90KEdvdmVybm1lbnRaQV90aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBTQSBHb3Zlcm5tZW50IEFjY291bnQgVHdlZXRzIiwgDQogICAgICAgY2FwdGlvbj0iVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBTQSBHb3Zlcm5tZW50IHRpbWUgc2VyaWVzIGdyYXBoIHNob3dzIHRoYXQgdGhlIGFjY291bnQgZG9lcyBub3QgcG9zdCB0d2VldHMgdmVyeSByZWd1bGFybHksIGF2ZXJhZ2luZyBsZXNzIHRoYW4gMjUgdHdlZXRzIGEgd2VlayBhbmQgdGhlaXIgcGFzdCAzMjAwIHR3ZWV0cyBzcGFuIGZpdmUgbW9udGhzLiBUaGVyZSB3YXMgYSBzcGlrZSBpbiBpbiB0d2VldHMgYXJvdW5kIE1hcmNoIDIwMjEuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IHNoYXJlZCB0d2VldHMNCkdvdmVybm1lbnRaQV9maWcgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBHb3ZaQV9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpHb3Zlcm5tZW50WkFfZmlnDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgYXMgb2YgSnVseSAyMDIxIGlzIHJlZ2FyZGluZyBQcmVzaWRlbnQgQ3lyaWwgUmFtYXBob3Nh4oCZcyBhZGRyZXNzIHRvIHRoZSBuYXRpb24gd2l0aCByZWdhcmRzIHRvIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBvbiAxIEZlYnJ1YXJ5IDIwMjEuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNIYXNodGFnIHBsb3QNCmdncGxvdChHb3Zlcm5tZW50WkFfZGZfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgSGFzaHRhZ3MgaW4gU0EgR292ZXJubWVudCBUd2VldHMiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIGhhc2h0YWdzIGluIFNBIEdvdmVybm1lbnQgdHdlZXRzIGluZGljYXRlcyB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJwjQ09WSUQxOeKAnSwg4oCcI1N0YXlTYWZl4oCdLCDigJwjVmFjY2luYXRlVG9TYXZlU291dGhBZnJpY2HigJ0sIOKAnCNTT05BMjAyMeKAnSwg4oCcI0NPVklEMTlTQeKAnSwg4oCcI0Nob29zZVZhY2NpbmF0aW9u4oCdLCDigJwjR3Jvd1NvdXRoQWZyaWNh4oCdLCDigJwjVmFjY2luZVJvbGxvdXRTQeKAnSwg4oCcI1JJUCBKYWNrc29uTXRoZW1ideKAnSwg4oCcUG9zdENhYmluZXTigJ0gYW5kIOKAnCNDb3ZpZDE5U0HigJ0uIEZyb20gdGhpcyBmaWd1cmUgaXQgY2FuIGJlIHNlZW4gdGhhdCAgbWFqb3JpdHkgb2YgdGhlIHRvcCB0ZXJtcyByZWZlciB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMgb3IgdGhlIHZhY2NpbmF0aW9uIG9mIFNvdXRoIEFmcmljYW5zLiAgDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNCkdvdmVybm1lbnRaQV9maWcxIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IEdvdlpBX2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KR292ZXJubWVudFpBX2ZpZzENCmBgYA0KDQpUaGUgdGFibGUgc2hvd2luZyB0aGUgbW9zdCBsaWtlZCB0d2VldHMgaW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBhcmUgdGhlIHRvcCBmaXZlIG1vc3QgIGxpa2VkIHR3ZWV0cyAoaW4gZGVzY2VuZGluZyBvcmRlcik6IGZpcnN0IHNoaXBtZW50IG9mIE94Zm9yZCBBc3RyYVplbmVjYSB2YWNjaW5lIGRvc2VzLCB0aGUgZmlyc3QgaGVhbHRoY2FyZSB3b3JrZXIgdmFjY2luYXRlZCBpbiBTb3V0aCBBZnJpY2EsIGFuIGFubm91bmNlbWVudCBpbmRpY2F0aW5nIHRoYXQgUHJlc2lkZW50IFJhbWFwaG9zYSB3aWxsIG1lZXQgdGhlIGFycml2aW5nIHNoaXBtZW50IG9mIE94Zm9yZCBBc3RyYVplbmVjYSB2YWNjaW5lcywgUklQIG5vdGljZSBvZiBKYWNrc29uIE1ldGhlbWJ1ICBhbmQgYSByZXBvcnQgdGhhdCB0aGUgUHJlc2lkZW50IHdpbGwgYWRkcmVzcyB0aGUgbmF0aW9uIG9uIDMwIE1heSAyMDIxIHdpdGggcmVnYXJkcyB0byB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KEdvdmVybm1lbnRaQV9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogICAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBNZW50aW9ucyBpbiBTQSBHb3Zlcm5tZW50IFR3ZWV0cyIpDQpgYGANCg0KVGhlIGJhciBjaGFydCBzaG93aW5nIHRoZSB0b3AgbWVudGlvbnMgaW4gU0EgR292ZXJubWVudCB0d2VldHMgaW5kaWNhdGVzIHRoYXQgKGluIGRlc2NlbmRpbmcgb3JkZXIpIOKAnEBDeXJpbFJhbWFwaG9zYeKAnSwg4oCcQERyWndlbGllTWtoaXpl4oCdLCDigJxAR292dmVybm1lbnRaQeKAnSwg4oCcQEhlYWx0aFpB4oCdLCDigJxARERNYWJ1emHigJ0sIOKAnEBQYXJsaW1lbnRvZlJTQeKAnSwg4oCcQFNBUG9saWNlU2VydmljZeKAnSwg4oCcQERCRVNB4oCdLCDigJxASGlnaGVyRWR1R292WkHigJ0gYW5kIOKAnEBHQ0lTTWVkaWHigJ0gYXJlIHRoZSB0b3AgbWVudGlvbnMgaW4gdGhlaXIgdHdlZXRzLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUT1AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KEdvdmVybm1lbnRaQV9kZl93b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBXb3JkcyBpbiBTQSBHb3Zlcm5tZW50IFR3ZWV0cyIpDQoNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCB3b3JkcyBpbiBTQSBHb3Zlcm5tZW50IHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJxwcmVzaWRlbnTigJ0sIOKAnG1pbmlzdGVy4oCdLCDigJxzb3V0aOKAnSwg4oCccmFtYXBob3Nh4oCdLCDigJx0b3RhbOKAnSwg4oCcYWZyaWNh4oCdLCDigJx3YXRjaOKAnSwg4oCcc2HigJ0sIOKAnHZhY2NpbmF0aW9u4oCdIGFuZCDigJxsaXZl4oCdIGFyZSB0aGUgdG9wIHdvcmRzIHVzZWQgaW4gdGhlaXIgdHdlZXRzLiBGcm9tIHRoaXMgZmlndXJlLCBpdCBpcyBpbmRpY2F0ZWQgdGhhdCB0aGUgdGVybSDigJx2YWNjaW5hdGlvbuKAnSBpcyBhbiBpbXBvcnQgYW5kIHByZXZhbGVudCB0ZXJtIGluIHRoZSBpbiB0aGUgU0EgR292ZXJubWVudCB0d2VldHMgY29sbGVjdGVkLiANCg0KIyMgU291dGggQWZyaWNhbiBHb3Zlcm5tZW50IE5ld3MgKEBTQWdvdm5ld3MpDQoNCk9mZmljaWFsIFNvdXRoIEFmcmljYW4gR292ZXJubWVudCBOZXdzIEFjY291bnQgb24gdGhlIFR3aXR0ZXIgUGxhdGZvcm0uDQoNCmBgYHtyIFNBZ292bmV3cyBwbG90cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQoNCiNTQWdvdm5ld3MgVGltZWxpbmUgRnJlcXVlbmN5DQp0c19wbG90KFNBZ292bmV3c190aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBTQSBHb3Zlcm5tZW50IE5ld3MgQWNjb3VudCBUd2VldHMiLA0KICAgICAgIGNhcHRpb24gPSAiVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNClNBZ292bmV3c19maWcxIDwtIA0KICBwbG90X2x5KA0KICB0eXBlID0gJ3RhYmxlJywNCiAgY29sdW1ub3JkZXIgPSBjKDEsMiksDQogIGNvbHVtbndpZHRoID0gYygyNTAsNDAwKSwNCiAgaGVhZGVyID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBjKCc8Yj5Nb3N0IExpa2VkIFR3ZWV0czwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBTQWdvdm5ld3NfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpTQWdvdm5ld3NfZmlnMQ0KYGBgDQpBbW9uZyB0aGUgdG9wIDUgbW9zdCBsaWtlZCB0d2VldHMgZnJvbSB0aGUg4oCYQFNBZ292bmV3c+KAmSBhY2NvdW50IG5vbmUgc2VlbSB0byBob2xkIHJlbGV2YW50IGluZm9ybWF0aW9uIG9uIGNvdmlkIDE5LiANCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojSGFzaHRhZyBwbG90DQpnZ3Bsb3QoU0Fnb3ZuZXdzX2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIFNBIEdvdmVybm1lbnQgTmV3cyBUd2VldHMiKQ0KYGBgDQpUb3AgaGFzaHRhZ3MgYXJlIHN0cnVjdHVyZWQgYXMgZm9sbG93czogMS4g4oCYI0NPVklEMTnigJksIDIuIOKAmCNTT05BMjAyMeKAmSwgMy4g4oCYI1ZhY2NpbmVSb2xsb3V0U0HigJksIDQuIOKAmCNQb3N0Q2FiaW5ldOKAmSwgNS4g4oCYI1N0YXlTYWZl4oCZLCA2LiDigJgjUmFtYXBob3NhUWFuZEHigJksIDcuIOKAmCNQb3N0Q2FiTWVkaWFCcmllZmluZ+KAmSwgOC4g4oCYI0J1aWxkaW5nQU5ld0Vjb25vbXnigJksIDkuIOKAmCNDcmltZVN0YXRpc3RpY3PigJkgMTAuIOKAmCNGcmVlZG9tRGF5MjAyMeKAmQ0KDQpgYGB7ciAgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBzaGFyZWQgdHdlZXRzIHBsb3QNClNBZ292bmV3c19maWcgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjUwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBTQWdvdm5ld3Nfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KU0Fnb3ZuZXdzX2ZpZw0KYGBgDQpUaGUgb2ZmaWNpYWwgbmV3cyBhZ2VuY3kgb2YgdGhlIFNvdXRoIEFmcmljYW4gR292ZXJubWVudOKAmXMgbW9zdCBmcmVxdWVudGx5IHNoYXJlZCB0d2VldCBpcyBub3QgcmVsZXZhbnQgdG8gdGhpcyByZXBvcnQuIA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgbWVudGlvbnMgcGxvdA0KZ2dwbG90KFNBZ292bmV3c19kZl9tZW50aW9ucywgYWVzKHggPSByZW9yZGVyKG1lbnRpb25zLCBuKSwgeSA9IG4pKSArDQogICAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSANCiAgZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxLCBzaXplPTgpKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xNSkpKw0KICB5bGFiKCJGcmVxdWVuY3kiKSsNCiAgeGxhYigiIikrDQogIGdndGl0bGUoIlRvcCBNZW50aW9ucyBpbiBTQSBHb3Zlcm5tZW50IE5ld3MgVHdlZXRzIikNCmBgYA0KVGhlIHRvcCBtZW50aW9ucyB3aXRoaW4gdGhlIGNhcHR1cmVkIHR3ZWV0cyBvZiDigJhAU0Fnb3ZuZXdz4oCZIGFyZTogMS4g4oCYQEN5cmlsUmFtYXBob3Nh4oCZIDIuIOKAmEBIZWFsdGhaQeKAmSAzLiDigJhARHJad2VsaU1raGl6ZeKAmSA0LiDigJhAUHJlc2lkZW5jeVpB4oCZIDUuIOKAmEBTQVBvbGljZVNlcnZpY2XigJkuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCB3b3JkcyBwbG90DQpnZ3Bsb3QoU0Fnb3ZuZXdzX2RmX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluICBTQSBHb3Zlcm5tZW50IE5ld3MgVHdlZXRzIikNCg0KYGBgDQpUaGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgd29yZCBpcyDigJhyZWFk4oCZLCBkdWUgdG8gdGhlIGFjY291bnQgdXNpbmcgaXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBleHRlbmRlZCByZWFkaW5nIG1hdGVyaWFsIHRocm91Z2ggdXNpbmcg4oCcW1JlYWRd4oCdIGluIHRoZSBiZWdpbm5pbmcgb2YgY2VydGFpbiB0d2VldHMuIA0KDQojIyBIZWFsdGgyNCAoQEhlYWx0aDI0Y29tKQ0KDQpIZWFsdGgyNCBpcyBhIGJyYW5jaCBvZiBOZXdzMjQsIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCB0aGV5IHNwZWNpYWxpc2UgaW4gaGVhbHRoY2FyZSByZWxhdGVkIG5ld3MsIHdoZXJlYXMgTmV3czI0IHRha2VzIGEgbW9yZSBnZW5lcmFsIGFwcHJhb2NoLiANCmBgYHtyIEhFQUxUSDI0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KI0hlYWx0aDI0IFRpbWVsaW5lIEZyZXF1ZW5jeQ0KdHNfcGxvdChoZWFsdGgyNF90aW1lbGluZV9kZiwgY29sb3IgPSAiIzAwQURCNSIsIHNpemUgPSAxKSArDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIkZyZXF1ZW5jeSBvZiBIZWFsdGgyNCBUd2VldHMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICsNCiAgeWxhYigiRnJlcXVlbmN5IikNCmBgYA0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNNb3N0IGxpa2VkIFR3ZWV0cyBQbG90DQpoZWFsdGgyNF9maWcxIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgTGlrZWQgVHdlZXRzPC9iPjxicj5hcyBvZiBKdWx5IDIwMjEnLCAnPGI+VHdlZXQgRGVzY3JpcHRpb248L2I+JyksDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gJyMwMEFEQjUnKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCdjZW50ZXInKSwNCiAgICBmb250ID0gbGlzdChjb2xvciA9ICd3aGl0ZScsIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gNDANCiAgKSwNCiAgY2VsbHMgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGhlYWx0aDI0X2xpa2VfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KaGVhbHRoMjRfZmlnMQ0KYGBgDQpUaGUgNHRoIG1vc3QgbGlrZWQgdHdlZXQgb2YgSGVhbHRoMjQgcGVydGFpbnMgdGhhdCBvZiBhbiBhcnRpY2xlIGRlc2NyaWJpbmcgdGhlIGx1bmdzIG9mIENPVklELTE5IHBhdGllbnRzLCB0aGUgb25seSBIZWFsdGgyNCB0d2VldCByZWxldmFudCBvbiB0aGlzIHBsb3QuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI0hhc2h0YWcgcGxvdA0KZ2dwbG90KGhlYWx0aDI0X2RmX2hhc2h0YWdzLCBhZXMoeCA9IHJlb3JkZXIoaGFzaHRhZywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIEhhc2h0YWdzIGluIGhlYWx0aDI0IFR3ZWV0cyIpDQpgYGANClRvcCBoYXNodGFncyBhcmUgc3RydWN0dXJlZCBhcyBmb2xsb3dzOiAxLiDigJgjQmV5b25kQmVhdXR54oCZLCAyLiDigJgjU2tpbkNhcmXigJksIDMuIOKAmCNjb3JvbmF2aXJ1c+KAmSwgNC4g4oCYI0NvdmlkMTnigJksIDUuIOKAmCNTa2luUmVuZXdhbFNB4oCZLCA2LiDigJgjYXN0aG1h4oCZLCA3LiDigJgjVGVuYeKAmSwgOC4g4oCYI2JleW9uZGJlYXV0eeKAmSwgOS4g4oCYI1NraW5SZW5ld2Fs4oCZIDEwLiDigJgjQ29yb25hdmlydXPigJkNCg0KYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0V9DQojTW9zdCBmcmVxdWVudCBzaGFyZWQgdHdlZXRzDQpoZWFsdGgyNF9maWcgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBGcmVxdWVudGx5IFNoYXJlZCBUd2VldDwvYj48YnI+YXMgb2YgSnVseSAyMDIxJywgJzxiPlR3ZWV0IERlc2NyaXB0aW9uPC9iPicpLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9ICcjMDBBREI1JyksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSAnd2hpdGUnLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDQwDQogICksDQogIGNlbGxzID0gbGlzdCgNCiAgICB2YWx1ZXMgPSBoZWFsdGgyNF9zaGFyZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQpoZWFsdGgyNF9maWcNCmBgYA0KVGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgY29uY2VybnMgdGhlIHBzeWNob2xvZ2ljYWwgaW1wbGljYXRpb25zIG9uIGRvY3RvcnMgYmVjYXVzZSBvZiB0aGUgQ09WSUQtMTkgZXBpZGVtaWMuDQoNCmBgYHtyIHJlc3VsdHM9J2hpZGUnLCBlY2hvPUZBTFNFfQ0KI1RvcCBtZW50aW9ucyBwbG90DQpnZ3Bsb3QoaGVhbHRoMjRfZGZfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAiIzAwQURCNSIpKw0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gDQogIGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSwgc2l6ZT04KSkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemU9MTUpKSsNCiAgeWxhYigiRnJlcXVlbmN5IikrDQogIHhsYWIoIiIpKw0KICBnZ3RpdGxlKCJUb3AgTWVudGlvbnMgaW4gaGVhbHRoMjQgVHdlZXRzIikNCmBgYA0KVGhlIHRvcCBtZW50aW9ucyB3aXRoaW4gdGhlIGNhcHR1cmVkIHR3ZWV0cyBvZiDigJhAU0Fnb3ZuZXdz4oCZIGFyZTogMS4g4oCYQEN5cmlsUmFtYXBob3Nh4oCZIDIuIOKAmEBIZWFsdGhaQeKAmSAzLiDigJhARHJad2VsaU1raGl6ZeKAmSA0LiDigJhAUHJlc2lkZW5jeVpB4oCZIDUuIOKAmEBTQVBvbGljZVNlcnZpY2XigJkuDQoNCmBgYHtyICByZXN1bHRzPSdoaWRlJywgZWNobz1GQUxTRX0NCiNUb3AgMTAgd29yZHMNCmdncGxvdChoZWFsdGgyNF9kZl93b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IA0KICBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEsIHNpemU9OCkpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSkrDQogIHlsYWIoIkZyZXF1ZW5jeSIpKw0KICB4bGFiKCIiKSsNCiAgZ2d0aXRsZSgiVG9wIFdvcmRzIGluIGhlYWx0aDI0IFR3ZWV0cyIpDQoNCmBgYA0KVGhlIDR0aCBtb3N0IGZyZXF1ZW50bHkgdXNlZCB3b3JkIGlzIOKAmGhlYWx0aOKAmSwgZm9sbG93ZWQgYnkg4oCYY292aWQxOeKAmSBhdCA3dGggcGxhY2UuIFRob3NlIGFyZSBzb2xlbHkgYXBwbGljYWJsZSB0byB0aGlzIHJlcG9ydC4gDQoNCiMjIEFsbCBDaG9zZW4gTWVkaWEgVHdlZXQgRGF0YSBBbmFseXNpcw0KDQpUaGUgZm9sbG93aW5nIHNlY3Rpb24gaXMgdGhlIGFuYWx5c2lzIG9mIHRoZSBhbGwgdGhlIFR3aXR0ZXIgYWNjb3VudHMgY29tYmluZWQuIA0KDQpgYGB7ciBhbGxfbWVkaWEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KI0NvbXBsZXRlIG1lZGlhIHNvdXJjZSBUaW1lbGluZSBGcmVxdWVuY3kNCnRzX3Bsb3QoY29tcGxldGVfZGF0YV9zb3VyY2VfZGYsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJGcmVxdWVuY3kgb2YgVHdlZXRzIGZyb20gYWxsIE1lZGlhIFNvdXJjZXMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpICArDQogIHlsYWIoIkZyZXF1ZW5jeSIpDQpgYGANCg0KVGhlIG92ZXJhbGwgbWVkaWEgdGltZSBzZXJpZXMgZ3JhcGggc2hvd3MgdGhhdCB0aGUgY29sbGVjdGVkIHR3ZWV0IGRhdGEgc3BhbiBmcm9tIHRoZSBlbmQgb2YgMjAxNyB0aWxsIEp1bHkgMjAyMS4gRnJvbSB0aGUgc3RhcnQgdGlsbCAyMDIwLCB0aGUgdHdlZXQgZnJlcXVlbmN5IHdhcyByZWxhdGl2ZWx5IGxvdywgaG93ZXZlciBmb3JtIHRoZSBiZWdpbm5pbmcgb2YgMjAyMCB0aGVyZSB3YXMgYSBsYXJnZSBpbmNyZWFzZSB0d2VldHMuIFRoaXMgaW5jcmVhc2UgY2FuIHBvc3NpYmx5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHN0YXJ0IG9mIGxvY2tkb3duIGluIFNvdXRoIEFmcmljYS4gRnJvbSB0aGUgc3RhcnQgb2YgMjAyMSB0aGVyZSBhcmUgZXZlbiBsYXJnZXIgaW5jcmVhc2VzIGNvbnRpbnVpbmcgYXMgdGltZSBnb2VzIGJ5LiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI01vc3QgZnJlcXVlbnQgc2hhcmVkIHR3ZWV0cw0KbWVkaWFfc2hhcmVfZmlnIDwtIHBsb3RfbHkoDQogIHR5cGUgPSAndGFibGUnLA0KICBjb2x1bW5vcmRlciA9IGMoMSwyKSwNCiAgY29sdW1ud2lkdGggPSBjKDI1MCw0MDApLA0KICBoZWFkZXIgPSBsaXN0KA0KICAgIHZhbHVlcyA9IGMoJzxiPk1vc3QgRnJlcXVlbnRseSBTaGFyZWQgVHdlZXQ8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gbWVkaWFfc2hhcmVfdmFsLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJyM1MDY3ODQnKSwNCiAgICBmaWxsID0gbGlzdChjb2xvciA9IGMoJyNmOGY0ZmYnLCAnd2hpdGUnKSksDQogICAgYWxpZ24gPSBjKCdsZWZ0JywgJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gYygnIzUwNjc4NCcpLCBzaXplID0gMTIpLA0KICAgIGhlaWdodCA9IDMwDQogICAgKSkNCg0KbWVkaWFfc2hhcmVfZmlnDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgZnJlcXVlbnRseSBzaGFyZWQgdHdlZXQgYXMgb2YgSnVseSAyMDIxIGluZGljYXRlcyB0aGF0IHRoZSBtb3N0IHNoYXJlZCB0d2VldCBpcyByZWdhcmRpbmcgdGhlIGRlYXRoIG9mIFRCICBKb3NodWEuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KI01vc3QgbGlrZWQgVHdlZXRzIFBsb3QNCm1lZGlhX2ZpZzEgPC0gcGxvdF9seSgNCiAgdHlwZSA9ICd0YWJsZScsDQogIGNvbHVtbm9yZGVyID0gYygxLDIpLA0KICBjb2x1bW53aWR0aCA9IGMoMjgwLDQwMCksDQogIGhlYWRlciA9IGxpc3QoDQogICAgdmFsdWVzID0gYygnPGI+TW9zdCBMaWtlZCBUd2VldHM8L2I+PGJyPmFzIG9mIEp1bHkgMjAyMScsICc8Yj5Ud2VldCBEZXNjcmlwdGlvbjwvYj4nKSwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICcjNTA2Nzg0JyksDQogICAgZmlsbCA9IGxpc3QoY29sb3IgPSAnIzAwQURCNScpLA0KICAgIGFsaWduID0gYygnbGVmdCcsJ2NlbnRlcicpLA0KICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3doaXRlJywgc2l6ZSA9IDEyKSwNCiAgICBoZWlnaHQgPSA0MA0KICApLA0KICBjZWxscyA9IGxpc3QoDQogICAgdmFsdWVzID0gbWVkaWFfbGlrZV92YWwsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzUwNjc4NCcpLA0KICAgIGZpbGwgPSBsaXN0KGNvbG9yID0gYygnI2Y4ZjRmZicsICd3aGl0ZScpKSwNCiAgICBhbGlnbiA9IGMoJ2xlZnQnLCAnY2VudGVyJyksDQogICAgZm9udCA9IGxpc3QoY29sb3IgPSBjKCcjNTA2Nzg0JyksIHNpemUgPSAxMiksDQogICAgaGVpZ2h0ID0gMzANCiAgICApKQ0KDQptZWRpYV9maWcxDQpgYGANCg0KVGhlIHRhYmxlIHNob3dpbmcgdGhlIG1vc3QgbGlrZWQgdHdlZXRzIGluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBtb3N0IGxpa2VkIHR3ZWV0cyAoaW4gZGVzY2VuZGluZyBvcmRlcik6IEEgcHJpbmNpcGFsIChEciBOZ3dha28gU3RlcGhlbiBTZWJvcGV0c2EpIGluIExpbXBvcG8gZ2l2ZW4gYSBnbG9iYWwgYXdhcmQsIHRoZSBwb2xpdGljYWwgdW5yZXN0IGluIEVzd2F0aW5pLCB0aGUgcmVzaWduYXRpb24gb2YgUGh1bXppbGUgdmFuIERhbW1lIGFzIERBIE1QIGFuZCBwYXJ0eSBtZW1iZXIsIHRoZSBwYXNzaW5nIG9mIFNoYWxlZW4gU3VydGllIFJpY2hhcmRzIGFuZCB0aGUgcG9zdHBvbmVtZW50IG9mIFp1bWHigJlzIGFycmVzdCBwZW5kaW5nIENvbkNvdXJ0IGFwcGxpY2F0aW9uLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KYWxsX21lZGlhX2hhc2h0YWdzIDwtIA0KICBjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZiAlPiUgDQogIHVubmVzdF90b2tlbnMoaGFzaHRhZywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChoYXNodGFnLCAiXiMiKSkgJT4lDQogIGNvdW50KGhhc2h0YWcsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmdncGxvdChhbGxfbWVkaWFfaGFzaHRhZ3MsIGFlcyh4ID0gcmVvcmRlcihoYXNodGFnLCBuKSwgeSA9IG4pLCBjb2xvciA9IGhhc2h0YWcpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikgKw0KICBnZ3RpdGxlKCJUb3AgVGVuIEhhc2h0YWdzIGluIENob3NlbiBNZWRpYSBUd2VldHMiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTMpKSArIA0KICBjb29yZF9mbGlwKCkrDQogIHRoZW1lX2hjKCkrDQogIHhsYWIoIkhhc2h0YWdzIikNCmBgYA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dpbmcgdGhlIHRvcCBoYXNodGFncyBpbiBvdmVyYWxsIG1lZGlhIHR3ZWV0cyBpbmRpY2F0ZXMgdGhhdCAoaW4gZGVzY2VuZGluZyBvcmRlcikg4oCcI0NPVklEMTnigJ0sIOKAnCNEU1RWNDAz4oCdLCDigJwjZU5DQeKAnSwg4oCcI0NPVklEMTlTQeKAnSwg4oCcI1N0YXlTYWZl4oCdLCDigJwjQ29yb25hVmlydXNTQeKAnSwg4oCcI1ZhY2NpbmVSb2xsb3V0U0HigJ0sIOKAnCN2YWNjaW5l4oCdLCDigJwjQmhla2lzaXNhUmVzb3VyY2XigJ0gYW5kIOKAnFNPTkEyMDIx4oCdLiAgRnJvbSB0aGlzIGZpZ3VyZSBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBoYXNodGFncyBwZXJ0YWluaW5nIHRvIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBhcmUgbW9zdCBwcmV2YWxlbnQuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQphbGxfbWVkaWFfbWVudGlvbnMgPC0gDQogIGNvbXBsZXRlX2RhdGFfc291cmNlX2RmICU+JSANCiAgdW5uZXN0X3Rva2VucyhtZW50aW9ucywgdGV4dCwgInR3ZWV0cyIsIHRvX2xvd2VyID0gRkFMU0UpICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtZW50aW9ucywgIl5AIikpICU+JSANCiAgY291bnQobWVudGlvbnMsIHNvcnQgPSBUUlVFKSAlPiUNCiAgdG9wX24oMTApDQoNCmdncGxvdChhbGxfbWVkaWFfbWVudGlvbnMsIGFlcyh4ID0gcmVvcmRlcihtZW50aW9ucywgbiksIHkgPSBuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiMwMEFEQjUiKSArDQogIGdndGl0bGUoIlRvcCBUZW4gTWVudGlvbnMgaW4gQ2hvc2VuIE1lZGlhIFR3ZWV0cyIpICsNCiAgY29vcmRfZmxpcCgpKw0KICB0aGVtZV9oYygpKw0KICB4bGFiKCJNZW50aW9ucyIpKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIG1lbnRpb25zIGluIHRoZSBvdmVyYWxsIG1lZGlhIHR3ZWV0cyBpbmRpY2F0ZXMgdGhhdCAoaW4gZGVzY2VuZGluZyBvcmRlcikg4oCcQEN5cmlsUmFtYXBob3Nh4oCdLCDigJxASGVhbHRoWkHigJ0sIOKAnEB2YW5keWtqb2Fu4oCdICAs4oCcQERyWndlbGllTWtoaXpl4oCdLCDigJxARmluMjTigJ0sIOKAnEBTcG9ydHMyNG5ld3PigJ0sIOKAnEBtaWFtYWxhbuKAnSwg4oCcQFdpdG5lc3NLWk7igJ0sIOKAnEBCbFNvdXRoQWZyaWNh4oCdIGFuZCDigJxATmtvUmFwaGFlbOKAnSBhcmUgdGhlIHRvcCBtZW50aW9ucyBpbiB0aGUgb3ZlcmFsbCBtZWRpYSB0d2VldHMuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmFsbF9tZWRpYV93b3JkcyA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKHM/KSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQ0KICB0b3BfbigxMCkNCg0KZ2dwbG90KGFsbF9tZWRpYV93b3JkcywgYWVzKHggPSByZW9yZGVyKHdvcmQsIG4pLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDBBREI1IikgKw0KICBnZ3RpdGxlKCJUb3AgVGVuIE1vc3QgUHJldmFsZW50IFdvcmRzIGluIENob3NlbiBNZWRpYSBUd2VldHMiKSArDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfaGMoKSsNCiAgeGxhYigiV29yZCIpKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNClRoZSBiYXIgY2hhcnQgc2hvd2luZyB0aGUgdG9wIHdvcmRzIGluIHRoZSBvdmVyYWxsIHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IChpbiBkZXNjZW5kaW5nIG9yZGVyKSDigJxzb3V0aOKAnSwg4oCcY292aWQxOeKAnSwg4oCcdG90YWzigJ0sIOKAnHByZXNpZGVudOKAnSwg4oCcYWZyaWNh4oCdLCDigJx0b3RhbOKAnSwg4oCccmVhZOKAnSwg4oCcbWluaXN0ZXLigJ0sIOKAnGhlYWx0aOKAnSwg4oCcZGVhdGhz4oCdIGFuZCDigJxwZW9wbGXigJ0gYXJlIHRoZSB0b3Agd29yZHMgdXNlZCBpbiB0aGVpciB0d2VldHMuIEZyb20gdGhpcyBmaWd1cmUsIGl0IGlzIGluZGljYXRlZCB0aGF0IHRoZSB0ZXJtIOKAnGNvdmlkMTnigJ0gaXMgYW4gaW1wb3J0IGFuZCBwcmV2YWxlbnQgdGVybSBpbiB0aGUgaW4gdGhlIG92ZXJhbGwgbWVkaWEgdHdlZXRzIGNvbGxlY3RlZC4gDQoNCiMjIFdvcmQgQ2xvdWQgb2YgdGhlIENvcnB1cyBvZiBBbGwgQ29tYmluZWQgTWVkaWEgU291cmNlcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIFdvcmQgQ2xvdWQgb2YgQWxsIE1lZGlhIENvcnB1cw0KcGFsIDwtDQogIGJyZXdlci5wYWwoOCwgIkRhcmsyIikNCg0Kd29yZGNsb3VkKGFsbF9tZWRpYV9jb3JwdXMsIG1pbi5mcmVxPTIsIG1heC53b3JkcyA9IDE1MCwgcmFuZG9tLm9yZGVyID0gVFJVRSwgY29sID0gcGFsKQ0KYGBgDQoNCg0KIyBUb3BpYyBNb2RlbGluZw0KDQpUb3BpYyBtb2RlbGxpbmcgaXMgYSB0eXBlIG9mIG1ldGhvZCB1c2VkIGluIGNvbmR1Y3RpbmcgYSB0ZXh0IGFuYWx5c2lzIG9mIHdvcmRzIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBtZXRob2QgYWltcyB0byBkZXRlcm1pbmUgdGhlIGhvdyB0aGUgbWVhbmluZyBvZiB0aGUgd29yZHMgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb250ZXh0IG9mIHRoZSB0ZXh0LiBUaGlzIGlzIG5vdCB0aGUgb25seSBtZXRob2QgdXNlZCB0byBhbmFseXNlIGdyb3VwZWQgd29yZHMsIG90aGVyIGV4YW1wbGVzIHN1Y2ggYXMgY2x1c3RlciBhbmFseXNpcyBhbmQgc2VtYW50aWMgYW5hbHlzaXMgYWxzbyBleGlzdC4gVGhlIGJlbmVmaXRzIG9mIHV0aWxpc2luZyBUb3BpYyBNb2RlbGxpbmcgaW5jbHVkZSBiZWluZyBhIG1peGVkIG1vZGVsIChlYWNoIGRvY3VtZW50IGlzIGdpdmVuIGEgcHJvYmFiaWxpdHkgb2YgYmVpbmcgbGlua2VkIHRvIGEgdG9waWMpIGFuZCB0aGlzIG1ldGhvZCBtYWtlcyB1c2Ugb2YgbW9yZSBhZHZhbmNlZCBpdGVyYXRpdmUgQmF5ZXNpYW4gdGVjaG5pcXVlcy4gKEJhaWwsIDIwMjApDQoNCiMjIFdoYXQgdG9waWNzIGhhdmUgYmVlbiByZXBvcnRlZCBvbjoNCg0KVGhlIG1haW4gdG9waWNzIHJlcG9ydGVkIG9uIGFyZSB0aGUgQ292aWQtMTkgcGFuZGVtaWMsIHZhY2NpbmF0aW9ucyBhbmQgdGhlIGxvY2tkb3duIGluIFNvdXRoIEFmcmljYS4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyBUZXJtIEZyZXF1ZW5jeSBJbnZlcnNlIERvY3VtZW50IEZyZXF1ZW5jeQ0KDQojIENsZWFuIGFuZCBjcmVhdGUgIFRGSURGIHRhYmxlIGRhdGEgZnJhbWUNCg0KdGlkeV9hbGxfbWVkaWFfdGZpZGY8LSANCiAgam9pbnRfdGltZWxpbmVzICU+JQ0KICAgIHNlbGVjdChzY3JlZW5fbmFtZSx0ZXh0KSAlPiUNCiAgICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KSAlPiUNCiAgICAgICAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQ0KICAgICAgICAgICBjb3VudCh3b3JkLCBzY3JlZW5fbmFtZSkgJT4lDQogICAgICAgICAgICAgIGJpbmRfdGZfaWRmKHdvcmQsIHNjcmVlbl9uYW1lLCBuKQ0KDQojIERldGVybWluZSB0aGUgdG9wIHRlbiBURklERiB3b3Jkcw0KDQp0b3BfYWxsX21lZGlhX3RmaWRmPC0NCiAgdGlkeV9hbGxfbWVkaWFfdGZpZGYgJT4lDQogIGFycmFuZ2UoZGVzYyh0Zl9pZGYpKSAgJT4lDQogIGdyb3VwX2J5KHNjcmVlbl9uYW1lKSAlPiUNCiAgdG9wX24oMTApICU+JQ0KICB1bmdyb3VwDQoNCiMgUGxvdCBiYXIgY2hhcnQgc2hvd2luZyB0aGUgaGlnaGVzdCBURklERiB3b3JkcyBmb3IgZWFjaCBzZWxlY3RlZCBtZWRpYSBzb3VyY2UNCg0KdG9wX2FsbF9tZWRpYV90ZmlkZiAlPiUNCiAgICBtdXRhdGUod29yZCA9IHJlb3JkZXJfd2l0aGluKHdvcmQsIHRmX2lkZiwgc2NyZWVuX25hbWUpKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHdvcmQsIHRmX2lkZiwgZmlsbCA9IHNjcmVlbl9uYW1lKSkgKw0KICAgIGdlb21fY29sKGFscGhhID0gMC44LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICAgZmFjZXRfd3JhcCh+IHNjcmVlbl9uYW1lLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAzKSArDQogICAgc2NhbGVfeF9yZW9yZGVyZWQoKSArDQogICAgY29vcmRfZmxpcCgpICsNCiAgICB0aGVtZShzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExKSkgKw0KICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAidGYtaWRmIiwNCiAgICAgICAgIHRpdGxlID0gIkhpZ2hlc3QgdGYtaWRmIHdvcmRzIGluIENob3NlbiBNZWRpYSBTb3VyY2VzIiwNCiAgICAgICAgIHN1YnRpdGxlID0gIkluZGl2aWR1YWwgTWVkaWEgU291cmNlcyBmb2N1cyBvbiBkaWZmZXJlbnQgd29yZCBlbGVtZW50cyIpDQpgYGANCg0KQSBjb2xsZWN0aW9uIG9mIGJhciBjaGFydHMgc2hvd2luZyB0aGUgd29yZHMgd2l0aCB0aGUgaGlnaGVzdCB0Zi1pZGYgZm9yIGVhY2ggb2YgdGhlIGNob3NlbiBzb3VyY2VzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpkYXRhKHN0b3Bfd29yZHMpDQoNCiMgVG9rZW5pemUgc2VsZWN0ZWQgbWVkaWEgc291cmNlcw0KDQp3b3JkZWRfbWVkaWEgPC0gDQogIGpvaW50X3RpbWVsaW5lcyAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkgJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKSANCg0KIyBDcmVhdGUgYSBEb2N1bWVudCBUZXJtIE1hdHJpeCBvZiBzZWxlY3RlZCBtZWRpYSBzb3VyY2VzDQoNCm1lZGlhX0RUTSA8LQ0KICB3b3JkZWRfbWVkaWEgJT4lDQogIGNvdW50KHNjcmVlbl9uYW1lLCB3b3JkKSAlPiUNCiAgY2FzdF9kdG0oc2NyZWVuX25hbWUsIHdvcmQsIG4pDQoNCiMgIENyZWF0ZSBhIHRvcGljIG1vZGVsIG9mIHNlbGVjdGVkIG1lZGlhIHNvdXJjZXMgd2l0aCBzaXggdG9waWNzDQoNCm1lZGlhX3RvcGljX21vZGVsIDwtIA0KICBMREEobWVkaWFfRFRNLCBrPTYsIGNvbnRyb2wgPSBsaXN0KHNlZWQgPSAzMjEpKQ0KDQojIENyZWF0ZSBhIGJldGEgbXRyaXggdG9waWMgbW9kZWwNCg0KbWVkaWFfdG9waWNzIDwtIA0KICB0aWR5KG1lZGlhX3RvcGljX21vZGVsLCBtYXRyaXggPSAiYmV0YSIpDQoNCiMgRGV0ZXJtaW5lIHRoZSB0b3AgdGVybXMNCg0KbWVkaWFfdG9wX3Rlcm1zIDwtIA0KICBtZWRpYV90b3BpY3MgJT4lDQogIGdyb3VwX2J5KHRvcGljKSAlPiUNCiAgdG9wX24oMTAsIGJldGEpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGFycmFuZ2UodG9waWMsIC1iZXRhKQ0KDQojIFBsb3QgYmFyIGNoYXJ0cyBzaG93aW5nIHRoZSBoaWdoZXN0IHdvcmQgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCB0b3BpYw0KDQptZWRpYV90b3BfdGVybXMgJT4lDQogIG11dGF0ZSh0ZXJtID0gcmVvcmRlcih0ZXJtLCBiZXRhKSkgJT4lDQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsIGZpbGwgPSAiIzAwQURCNSIpICsNCiAgZmFjZXRfd3JhcCh+IHRvcGljLCBzY2FsZXMgPSAiZnJlZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJiZXRhIiwNCiAgICAgICAgIHRpdGxlID0gIkhpZ2hlc3Qgd29yZCBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHRvcGljIiwNCiAgICAgICAgIHN1YnRpdGxlID0gIkRpZmZlcmVudCB3b3JkcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCB0b3BpY3MiKQ0KYGBgDQoNCkEgY29sbGVjdGlvbiBvZiBiZXRhIGJhciBjaGFydHMgc2hvd2luZyB0aGUgd29yZHMgd2l0aCB0aGUgaGlnaGVzdCBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHRvcGljLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIERldGVybWluZSB0aGUgdG9wIHRlbiBtZWRpYSB0b3BpY3MNCg0KYmV0YV93aWRlIDwtIA0KICBtZWRpYV90b3BpY3MgJT4lDQogIG11dGF0ZSh0b3BpYyA9IHBhc3RlMCgidG9waWMiLCB0b3BpYykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdG9waWMsIHZhbHVlc19mcm9tID0gYmV0YSkgJT4lIA0KICBmaWx0ZXIodG9waWMxID4gLjAwMSB8IHRvcGljMiA+IC4wMDEpICU+JQ0KICBtdXRhdGUobG9nX3JhdGlvID0gbG9nMih0b3BpYzIgLyB0b3BpYzEpKSAlPiUNCiAgdG9wX24oMTApDQoNCiMgUGxvdCB0b3AgdGVuIG1lZGlhIHRvcGljcw0KDQpnZ3Bsb3QoKSArDQogIGdlb21fY29sKGJldGFfd2lkZSwgDQogICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHJlb3JkZXIodGVybSwgdG9waWMxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHRvcGljMSksDQogICAgICAgICAgIGZpbGwgPSAiIzAwQURCNSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2d0aXRsZSgiVG9wIFRlbiBNZWRpYSBUb3BpY3MgQWNjb3JkaW5nIHRvIEJldGEgVG9waWMgTW9kZWwiKQ0KYGBgDQoNCkJhciBjaGFydCBzaG93aW5nIHRoZSB0b3AgdGVuIG1lZGlhIHRvcGljcyBhY2NvcmRpbmcgdG8gdGhlIEJldGEgTWF0cml4IG1lZGlhIHRvcGljIG1vZGVsIGF0IFRvcGljIDEgcHJvYmFiaWxpdGllcy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCm1lZGlhX2dhbW1hIDwtDQogIHRpZHkobWVkaWFfdG9waWNfbW9kZWwsIG1hdHJpeCA9ICJnYW1tYSIsDQogICAgICAgZG9jdW1lbnRfbmFtZXMgPSByb3duYW1lcyhqb2ludF90aW1lbGluZXMpKQ0KDQpnZ3Bsb3QobWVkaWFfZ2FtbWEsIGFlcyhnYW1tYSwgZmlsbCA9IGFzLmZhY3Rvcih0b3BpYykpKSArDQogIGdlb21faGlzdG9ncmFtKGFscGhhID0gMC44LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofiB0b3BpYywgbmNvbCA9IDMpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2Ygd29yZCBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIHRvcGljIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJFYWNoIHRvcGljIGlzIGFzc29jaWF0ZWQgd2l0aCBvbmUgc291cmNlIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBzb3VyY2VzIiwgeCA9IGV4cHJlc3Npb24oZ2FtbWEpKQ0KYGBgDQoNCkEgY29sbGVjdGlvbiBvZiBnYW1tYSBiYXIgY2hhcnRzIHNob3dpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiB3b3JkIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggdG9waWMuDQoNCiMgIFRleHQgTmV0d29ya3MNCg0KVGV4dCBOZXR3b3JrcyBhcmUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gd29yZHMuIFRoZXNlIG5ldHdvcmtzIGFyZSBhYmxlIHRvIHJlcHJlc2VudCBhIGNvcnB1cyBvZiBkb2N1bWVudHMgb3Igd29yZHMsIHdoZXJlIGVhY2ggZG9jdW1lbnQgb3Igd29yZCByZXByZXNlbnRzIGEgbm9kZSBhbmQgdGhlIGVkZ2VzIHdoaWNoIGNvbm5lY3Qgbm9kZXMgcmVwcmVzZW50IGhvdyBzaW1pbGFyIHdvcmRzIG9yIGRvY3VtZW50cyBhcmUgdG8gZWFjaCBvdGhlci4gSW4gdGhpcyByZXBvcnQsIHRleHQgbmV0d29ya3Mgd2VyZSB1c2VkIHRvIGRldGVybWluZSBob3cgZnJlcXVlbnQgd29yZHMgd291bGQgb2NjdXIgYWxvbmcgc2lkZSBlYWNoIG90aGVyLCB3aGVyZSB3b3JkcyByZXByZXNlbnQgbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgZnJlcXVlbmN5IG9mIHRoZSB3b3Jkcycgb2NjdXJyZW5jZS4gKEJhaWwsIDIwMjApDQoNCk1hbnkgYmVuZWZpdHMgZXhpc3Qgd2hlbiB1c2luZyB0ZXh0IG5ldHdvcmtzLiBUZXh0IG5ldHdvcmtzIGhlbHAgcmVjb2duaXNlIGFuZCB1bmRlcnN0YW5kIHBhdHRlcm5zIHdpdGhpbiB0ZXh0IGFuZCBob3cgdGhleSBhcmUgY29ubmVjdGVkLiBUZXh0IG5ldHdvcmtzIGFyZSB3b3JrYWJsZSB3aXRoIHRleHQgb2YgYW55IGxlbmd0aCB3aGVyZWFzIHRvcGljIG1vZGVsbGluZyBvbmx5IHdvcmtzIHdpdGggc2hvcnQgdGV4dC4gQnkgaWRlbnRpZnlpbmcgc29jaWFsIGNsdXN0ZXJzIGluIHRleHRzIG1vcmUgaW5zaWdodCBjYW4gYmUgZGVyaXZlZCBmcm9tIHRleHQsIGFzIG9wcG9zZWQgdG8gbW9yZSBzaW1wbGUgdGV4dCBhbmFseXNpcyB0ZWNobmlxdWVzLg0KDQojIyBBdXRob3ItYmFzZWQgVGV4dCBOZXR3b3JrIE1vZGVsaW5nIG9mIEFsbCBNZWRpYSBTb3VyY2VzOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGZpZy5wb3M9J0gnfQ0KDQojIFNsaWNlIGEgcG9ydGlvbiBvZiBjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZiBncm91cGVkIGJ5IHNjcmVlbl9uYW1lDQoNCm1lZGlhX2NvbGxlY3Rpb25fdGV4dCA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lIA0KICBncm91cF9ieShzY3JlZW5fbmFtZSkgJT4lIA0KICBzbGljZSgxTCkNCg0KIyBQcmVwYXJlIHRoZSB0ZXh0IGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgYXV0aG9yLWJhc2VkIHRleHQgbmV0d29yaw0KDQphdXRob3JfcHJlcHBlZF9tZWRpYV90ZXh0IDwtDQogIFByZXBUZXh0KG1lZGlhX2NvbGxlY3Rpb25fdGV4dCwNCiAgICAgICAgICAgZ3JvdXB2YXIgPSAic2NyZWVuX25hbWUiLA0KICAgICAgICAgICB0ZXh0dmFyID0gInRleHQiLA0KICAgICAgICAgICBub2RlX3R5cGUgPSAiZ3JvdXBzIiwNCiAgICAgICAgICAgdG9rZW5pemVyID0gIndvcmRzIiwNCiAgICAgICAgICAgcG9zID0gIm5vdW5zIiwNCiAgICAgICAgICAgcmVtb3ZlX3N0b3Bfd29yZHMgPSBUUlVFLA0KICAgICAgICAgICBjb21wb3VuZF9ub3VucyA9IFRSVUUpDQoNCiMgQ3JlYXRlIGF1dGhvci1iYXNlZCB0ZXh0IG5ldHdvcmsNCg0KYXV0aG9yX21lZGlhX3RleHRfbmV0d29yayA8LSBDcmVhdGVUZXh0bmV0KGF1dGhvcl9wcmVwcGVkX21lZGlhX3RleHQpDQoNCiMgVmlzdWFsaXplIHRleHQgbmV0d29yayBpbiBhIDJEIGZvcm1hdA0KDQphdXRob3JfdmlzX21lZGlhXzJkIDwtDQogIFZpc1RleHROZXQoYXV0aG9yX21lZGlhX3RleHRfbmV0d29yaywNCiAgICAgICAgICAgICBhbHBoYSA9IDIsDQogICAgICAgICAgICAgbGFiZWxfZGVncmVlX2N1dCA9IDApDQoNCiMgUHJpbnQgMkQgYXV0aG9yLWJhc2VkIHRleHQgbmV0d29yayANCg0KYXV0aG9yX3Zpc19tZWRpYV8yZA0KDQojIFZpc3VhbGl6ZSB0ZXh0IG5ldHdvcmsgaW4gYSAzRCBmb3JtYXQNCg0KYXV0aG9yX3Zpc19tZWRpYSA8LSBWaXNUZXh0TmV0RDMoYXV0aG9yX21lZGlhX3RleHRfbmV0d29yaywNCiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgIGNoYXJnZSA9IC0xMCwNCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDIpDQoNCiMgQ3JlYXRlIGFuZCBzYXZlIHRoZSB0ZXh0IG5ldHdvcmsgYXMgYW4gSFRNTCB3aWRnZXQNCg0Kc2F2ZVdpZGdldChhdXRob3JfdmlzX21lZGlhLCAiYXV0aG9yX21lZGlhX3RleHRfbmV0d29yay5odG1sIikNCg0KIyBQcmludCAzRCBhdXRob3ItYmFzZWQgdGV4dCBuZXR3b3JrIA0KDQphdXRob3JfdmlzX21lZGlhDQoNCiMgSWRlbnRpZnkgY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMgb2Ygd29yZHMgd2l0aGluIHRoZSB0ZXh0DQoNCmF1dGhvcl9tZWRpYV9jb21tdW5pdGllcyA8LQ0KICBUZXh0Q29tbXVuaXRpZXMoYXV0aG9yX21lZGlhX3RleHRfbmV0d29yaykNCg0KIyBJbnRlcnByZXQgdGV4dCBhbmQgaWRlbnRpZnkgMTAgaGlnaGVzdCBURklERiBmcmVxdWVuY2llcyB3aXRoaW4gZWFjaCBjbHVzdGVyDQoNCnRvcF93b3Jkc19tb2R1bGFyaXR5X2NsYXNzZXMgPC0NCiAgSW50ZXJwcmV0VGV4dChhdXRob3JfbWVkaWFfdGV4dF9uZXR3b3JrLA0KICAgICAgICAgICAgICAgIGF1dGhvcl9wcmVwcGVkX21lZGlhX3RleHQpDQoNCiMgQ2FsY3VsYXRlIGN1bHR1cmFsIGJldHdlZW5uZXNzIG9yIHRleHQgY2VudHJhbGl0eSANCg0KdGV4dF9jZW50cmFsaXR5IDwtIA0KICBUZXh0Q2VudHJhbGl0eShhdXRob3JfbWVkaWFfdGV4dF9uZXR3b3JrKQ0KYGBgDQoNCkZyb20gdGhlIGF1dGhvci1iYXNlZCB0ZXh0IG5ldHdvcmsgZmlndXJlcyBhYm92ZSwgaXQgY2FuIGJlIHN1cm1pc2VkIHRoYXQgdGhlcmUgYXJlIHR3byBhdXRob3IgY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMuIE9uZSB3aGljaCBjb25zaXN0cyBvZiBTQUJDIE5ld3MsICBTb3V0aCBBZnJpY2FuIEdvdmVybm1lbnQgTmV3cyBhbmQgSGVhbHRoMjQuY29tLiBBbm90aGVyIHdoaWNoIGNvbnNpc3RzIG9mIGVOQ0EsIEJoZWtpc2lzYSwgRVdOIGFuZCBOZXdzMjQuIEF0IGNsb3NlciBpbnNwZWN0aW9uLCBpdCBjYW4gYmUgIHNlZW4gdGhhdCB0aGVyZSBpcyBzdHJvbmdlciBzaW1pbGFyaXR5IGJldHdlZW4gU0EgR292ZXJubWVudCBOZXdzIGFuZCBIZWFsdGgyNC5jb20gdGhhbiBTQUJDIE5ld3MuIFRoZXJlIGlzIHN0cm9uZyBzaW1pbGFyaXR5IGJldHdlZW4gZU5DQSBhbmQgRVdOLCBCaGVraXNpc2EgYW5kIEVXTiwgYXMgd2VsbCBhcyBOZXdzMjQgYW5kIEVXTi4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlcmUgaXMgbm90IGEgc3Ryb25nIHNpbWlsYXJpdHkgYmV0d2VlbiBCaGVraXNpc2EgYW5kIGVOQ0EsIGFzIHdlbGwgYXMgYSBtb2RlcmF0ZSBzaW1pbGFyaXR5IGJldHdlZW4gRVdOIGFuZCBOZXdzMjQgd2hlbiBjb21wYXJlZCB0byBpdHMgb3RoZXIgY29ubmVjdGlvbnMuICAgICAgIA0KDQojIyBXb3JkLWJhc2VkIFRleHQgTmV0d29yayBNb2RlbGluZyBvZiBBbGwgTWVkaWEgU291cmNlczoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBmaWcucG9zPSdIJ30NCg0KIyBTbGljZSBhIHBvcnRpb24gb2Ygam9pbnRfdGltZWxpbmVzIGdyb3VwZWQgYnkgc2NyZWVuX25hbWUNCg0KbWVkaWFfY29sbGVjdGlvbl90ZXh0IDwtIA0KICBqb2ludF90aW1lbGluZXMgJT4lIA0KICBncm91cF9ieShzY3JlZW5fbmFtZSkgJT4lIA0KICBzbGljZSgxTCkNCg0KIyBQcmVwYXJlIHRoZSB0ZXh0IGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgd29yZC1iYXNlZCB0ZXh0IG5ldHdvcmsNCg0Kd29yZF9wcmVwcGVkX21lZGlhX3RleHQgPC0gDQogIFByZXBUZXh0KG1lZGlhX2NvbGxlY3Rpb25fdGV4dCwgDQogICAgICAgICAgIGdyb3VwdmFyID0gInNjcmVlbl9uYW1lIiwgDQogICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsIA0KICAgICAgICAgICBub2RlX3R5cGUgPSAid29yZHMiLCANCiAgICAgICAgICAgdG9rZW5pemVyID0gIndvcmRzIiwgDQogICAgICAgICAgIHBvcyA9ICJub3VucyIsIA0KICAgICAgICAgICByZW1vdmVfc3RvcF93b3JkcyA9IFRSVUUsIA0KICAgICAgICAgICBjb21wb3VuZF9ub3VucyA9IFRSVUUpDQoNCiMgQ3JlYXRlIHdvcmQtYmFzZWQgdGV4dCBuZXR3b3JrDQoNCndvcmRzX21lZGlhX3RleHRfbmV0d29yayA8LSBDcmVhdGVUZXh0bmV0KHdvcmRfcHJlcHBlZF9tZWRpYV90ZXh0KQ0KDQojIFZpc3VhbGl6ZSB0ZXh0IG5ldHdvcmsgaW4gYSAyRCBmb3JtYXQNCg0KVmlzVGV4dE5ldCh3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmssDQogICAgICAgICAgIGFscGhhID0gMiwNCiAgICAgICAgICAgbGFiZWxfZGVncmVlX2N1dCA9IDApDQoNCiMgVmlzdWFsaXplIHRleHQgbmV0d29yayBpbiBhIDNEIGZvcm1hdA0KDQp3b3Jkc192aXNfbWVkaWEgPC0gVmlzVGV4dE5ldEQzKHdvcmRzX21lZGlhX3RleHRfbmV0d29yaywNCiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA1MDAsDQogICAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgIGNoYXJnZSA9IC0xMCwNCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDIpDQoNCiMgQ3JlYXRlIGFuZCBzYXZlIHRoZSB0ZXh0IG5ldHdvcmsgYXMgYW4gSFRNTCB3aWRnZXQNCg0Kc2F2ZVdpZGdldCh3b3Jkc192aXNfbWVkaWEsICJ3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmsuaHRtbCIpDQoNCiMgUHJpbnQgM0Qgd29yZC1iYXNlZCB0ZXh0IG5ldHdvcmsgDQoNCndvcmRzX3Zpc19tZWRpYQ0KDQojIElkZW50aWZ5IGNsdXN0ZXJzIG9yIGNvbW11bml0aWVzIG9mIHdvcmRzIHdpdGhpbiB0aGUgdGV4dA0KDQp3b3Jkc19tZWRpYV9jb21tdW5pdGllcyA8LSANCiAgVGV4dENvbW11bml0aWVzKHdvcmRzX21lZGlhX3RleHRfbmV0d29yaykNCg0KIyBJbnRlcnByZXQgdGV4dCBhbmQgaWRlbnRpZnkgMTAgaGlnaGVzdCBURklERiBmcmVxdWVuY2llcyB3aXRoaW4gZWFjaCBjbHVzdGVyDQoNCndvcmRzX25ldHdvcmtfdG9wX3dvcmRzX21vZHVsYXJpdHlfY2xhc3NlcyA8LSANCiAgSW50ZXJwcmV0VGV4dCh3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmssIHdvcmRfcHJlcHBlZF9tZWRpYV90ZXh0KQ0KDQojIENhbGN1bGF0ZSBjdWx0dXJhbCBiZXR3ZWVubmVzcyBvciB0ZXh0IGNlbnRyYWxpdHkNCg0Kd29yZHNfdGV4dF9jZW50cmFsaXR5IDwtIA0KICBUZXh0Q2VudHJhbGl0eSh3b3Jkc19tZWRpYV90ZXh0X25ldHdvcmspDQpgYGANCg0KSW4gdGhlIHdvcmQtYmFzZWQgdGV4dCBuZXR3b3JrLCB0aGVyZSBoYXMgYmVlbiBzaXggY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMgaWRlbnRpZmllZC4gVGhlIGxhdGVudCB0aGVtZSB3aXRoaW4gdGhlIHBpbmsgY2x1c3RlciBpcyB0aGUgcmVwb3J0aW5nIGJ5IFNBQkMgTmV3cyBvbiBDT1ZJRC0xOS4gVGhlIGxhdGVudCB0aGVtZSB3aXRoaW4gdGhlIGJsYWNrIGNsdXN0ZXIgZm9jdXNlcyBvbiBCaGVraXNpc2EncyByZXBvcnRpbmcuIFRoZSByZWQgY2x1c3RlciBmb2N1c2VzIG9uIHRoZSBBTkMuICBUaGUgY3lhbiAoYnJpZ2h0IGxpZ2h0IGJsdWUpIGNsdXN0ZXIgZm9jdXNlcyBvbiBDT1ZJRC0xOSB2YWNjaW5hdGlvbnMuIFRoZSBncmVlbiBjbHVzdGVyIGZvY3VzZXMgb24gQ09WSUQtMTkgIGNhc2VzIGFuZCBob3NwaXRhbGl6YXRpb25zLiBUaGUgYmx1ZSBjbHVzdGVyIGZvY3VzZXMgb24gQ09WSUQtMTkgY2FzZSwgcmVjb3ZlcnksIGRlYXRoIGFuZCBvdGhlciBhc3NvY2lhdGVkIGRhdGEuIFRoZXJlIGlzIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBjeWFuLCBncmVlbiBhbmQgYmx1ZSBjbHVzdGVycyBpbmRpY2F0aW5nIHN0cm9uZyBzaW1pbGFyaXR5IGluIHdvcmRzIHVzZWQgdG8gY29udmV5IHNpbWlsYXIgdGhlbWVzLiAgIA0KDQojIFRoZSBTZW50aW1lbnQgb2YgdGhpcyByZXBvcnRpbmc6DQoNCg0KU2VudGltZW50IGFuYWx5c2lzIGlzIHRoZSBwcm9jZXNzIHdpdGggd2hpY2ggb25lIHRyaWVzIHRvIGlkZW50aWZ5IGFuZCBjbGFzc2lmeSB0aGUgdW5kZXJseWluZyBlbW90aW9ucyBkcmF3biBmcm9tIGEgcGllY2Ugb2YgdGV4dC5UaGUgdmlzdWFsaXNhdGlvbnMgYW5kIGRlc2NyaXB0aW9ucyBiZWxvdyB3ZXJlIGRvY3VtZW50ZWQgdXNpbmcgdGhlIOKAmGJpbmfigJkgbGV4aWNvbiwgYSB0ZXh0LWJhc2VkIGRpY3Rpb25hcnksIHdoaWNoIHRyYW5zY3JpYmVzIGFuZCBjYXRlZ29yaXNlcyB0ZXJtcyBpbiBhIGJpbmFyeSBmYXNoaW9uLiBBIHBsb3QgY29udGFpbmluZyB0aGUgYXZlcmFnZSBzZW50aW1lbnQgb2YgZWFjaCBvZiB0aGUgNiBtZWRpYSBzb3VyY2VzIHdlcmUgY2hvc2VuIHRvIGVuYWJsZSBhIGhvbGlzdGljIHBlcnNwZWN0aXZlIG9uIHRoZSBkYXRhLiBJbiB2aWV3aW5nIHRoZXNlIHNlbnRpbWVudCB2aXN1YWxpc2F0aW9ucywgdGhlIGRpZmZlcmVuY2UgaW4gZ292ZXJubWVudCBtZWRpYSBzb3VyY2VzIHRvIHRoYXQgb2YgcHJpdmF0ZSBtZWRpYSBhZ2VuY2llcyBiZWNvbWUgYXBwYXJlbnQuIEdvdmVybm1lbnQgc291cmNlcywgbGlrZSBIZWFsdGhaQSAoVGhlIFNvdXRoIEFmcmljYW4gRGVwYXJ0bWVudCBvZiBIZWFsdGgpIGFuZCBvdGhlcnMsIHBvc3QgdHdlZXRzIHJlZmxlY3RpbmcgdGhhdCBvZiBhIG1vcmUgbmV1dHJhbCB0byBwb3NpdGl2ZSBzdGFuY2UsIHdoZXJlYXMgcHJpdmF0ZSBtZWRpYSBhZ2VuY2llcyBwb3N0IHR3ZWV0cyB0aHJvdWdob3V0IHRoZSBzZW50aW1lbnQgc3BlY3RydW0uIA0KDQojIFNlbnRpbWVudCBBbmFseXNpcw0KDQpgYGB7ciBCaGVraXNpc2EgU2VudGltZW50IEFuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojc2VsZWN0DQpiaGVraXNpc2Ffc2VudCA8LQ0KICBiaGVraXNpc2FfdHdlZXRzICU+JQ0KICBzZWxlY3QoInNjcmVlbl9uYW1lIiwgInRleHQiKQ0KDQojbWFudWFsIHJlbW92YWwgb2YgaHR0cCBlbGVtZW50cw0KYmhla2lzaXNhX3NlbnQkc3RyaXBwZWRfdGV4dCA8LSBnc3ViKCJodHRwXFxTKyIsICIiLGJoZWtpc2lzYV9zZW50JHRleHQpDQoNCiN1bm5lc3RfdG9rZW5zIHRvIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSArIHJlbW92ZSBwdW5jdHVhdGlvbiArIGFkZCBpbmRpdiB0d2VldCBJRA0KYmhla2lzaXNhX3NlbnRfc3RlbSA8LSANCiAgYmhla2lzaXNhX3NlbnQgJT4lDQogIHNlbGVjdChzdHJpcHBlZF90ZXh0KSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdHJpcHBlZF90ZXh0KQ0KDQojcmVtb3ZlIHN0b3Agd29yZHMNCmNsZWFuZWRfYmhla2lzaXNhX3NlbnQgPC0gIA0KICBiaGVraXNpc2Ffc2VudF9zdGVtICU+JQ0KICBhbnRpX2pvaW4oc3RvcF93b3JkcykNCg0KI2Jpbmcgc2VudGltZW50IGFuYWx5c2lzIG9uIEJoZWtpc2lzYSB0d2VldHMNCmJpbmdfYmhla2lzaXNhIDwtIA0KICBjbGVhbmVkX2JoZWtpc2lzYV9zZW50ICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPVRSVUUpJT4lDQogIHVuZ3JvdXAoKQ0KICANCiNQbG90DQpiaW5nX2JoZWtpc2lzYSAlPiUNCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUNCiAgdG9wX24oMTApICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogIGdncGxvdChhZXMod29yZCwgbiwgZmlsbCA9IHNlbnRpbWVudCkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIGxhYnModGl0bGUgPSAiVHdlZXRzIG9mIEJoZWtpc2lzYSIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9oYygpDQpgYGANCuKAmHZpcnVz4oCZLCDigJhpbmZlY3RlZOKAmSwg4oCYZXBpZGVtaWPigJkgYXJlIGFtb25nIHRoZSB0b3AgZml2ZSBtb3N0IG5lZ2F0aXZlIHdvcmRzLiDigJhicmVha+KAmSBhbmQg4oCYYnJlYWtz4oCZIGFyZSBhbW9uZyB0aGUgb3RoZXIgdG9wIGZpdmUgd29yZHMsIGFuIGluZGljYXRpb24gb2YgdGhlIHRlcm0g4oCYb3V0YnJlYWvigJkv4oCZb3V0YnJlYWtz4oCZIGJlaW5nIHVzZWQgZnJlcXVlbnRseS4g4oCYc2V2ZXJl4oCZLCDigJhmZXZlcuKAmSBhbmQg4oCYcmlza+KAmSBhcmUgYW1vbmcgdGhlIHRvcCB0ZW4gbmVnYXRpdmUgd29yZHMuIOKAmHByb3RlY3TigJksIOKAmHN1cHBvcnTigJkgYW5kIOKAmGVmZmVjdGl2ZeKAmSBhcmUgdGhlIHRvcCBmb3VyIG1vc3QgcG9zaXRpdmUgd29yZHMgd2l0aCDigJhmcmVl4oCZIGJlaW5nIHRoZSB0b3AgcmFua2VkIHBvc2l0aXZlIHNlbnRpbWVudCB3b3JkLiANCg0KYGBge3IgTklDRFNlbnRpbWVudCBBbmFseXNpcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI3NlbGVjdA0KbmljZF9zZW50IDwtIA0KICBuaWNkX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikNCg0KI21hbnVhbCByZW1vdmFsIG9mIGh0dHAgZWxlbWVudHMNCm5pY2Rfc2VudCRzdHJpcHBlZF90ZXh0IDwtDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsbmljZF9zZW50JHRleHQpDQoNCiN1bm5lc3RfdG9rZW5zIHRvIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSArIHJlbW92ZSBwdW5jdHVhdGlvbiArIGFkZCBpbmRpdiB0d2VldCBJRA0KbmljZF9zZW50X3N0ZW0gPC0gDQogIG5pY2Rfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9uaWNkX3NlbnQgPC0NCiAgbmljZF9zZW50X3N0ZW0gJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKQ0KDQojYmluZyBzZW50aW1lbnQgYW5hbHlzaXMgb24gTklDRCB0d2VldHMNCmJpbmdfbmljZCA8LSANCiAgY2xlYW5lZF9uaWNkX3NlbnQgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgdW5ncm91cCgpDQoNCiNQbG90DQpiaW5nX25pY2QgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgTklDRCIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0KVGhlIHRvcCB0ZW4gbmVnYXRpdmUgd29yZHMgaW4gTklDRCB0d2VldHMgY291bGQgYmUgY2F0ZWdvcmlzZWQgYXMgYmVpbmcgaW4gcmVsYXRpb24gdG8gdGhlIGNvcm9uYXZpcnVzLiBBbW9uZyB0aGVzZSBuZWdhdGl2ZSB3b3JkcyBhcmUg4oCYc3ltcHRvbXPigJksIOKAmHJpc2vigJksIOKAmHZpcnVz4oCZLCDigJhzaWNr4oCZLCDigJhpbmZlY3Rpb27igJksIOKAmGlsbG5lc3PigJkgYW5kIOKAmGluZmVjdGlvbnPigJkuIFRoZSB0b3AgMTAgbW9zdCBwb3NpdGl2ZSB3b3JkcyBhcmUg4oCYc2FmZeKAmSwg4oCYcHJvdGVjdGl2ZeKAmSwg4oCYcHJvdGVjdOKAmSwg4oCYc21hcnTigJksIOKAmHJlZ2FyZOKAmSwg4oCYbG92ZWTigJksIOKAmGNvcnJlY3TigJksIOKAmHJlY292ZXJ54oCZLCDigJhyZWFkeeKAmSBhbmQg4oCYZW5jb3VyYWdl4oCZLg0KDQpgYGB7ciBEZXBhcnRtZW50IG9mIEhlYWx0aCAoQEhlYWx0aFpBKSBTZW50aW1lbnQgQW5hbHlzaXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiNTZWxlY3QNCmhlYWx0aHphX3NlbnQgPC0gDQogIGhlYWx0aHphX3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikNCg0KI21hbnVhbCByZW1vdmFsIG9mIGh0dHAgZWxlbWVudHMNCmhlYWx0aHphX3NlbnQkc3RyaXBwZWRfdGV4dCA8LQ0KICBnc3ViKCJodHRwXFxTKyIsICIiLGhlYWx0aHphX3NlbnQkdGV4dCkNCg0KI3VubmVzdF90b2tlbnMgdG8gY29udmVydCB0byBsb3dlciBjYXNlICsgcmVtb3ZlIHB1bmN0dWF0aW9uICsgYWRkIGluZGl2IHR3ZWV0IElEDQpoZWFsdGh6YV9zZW50X3N0ZW0gPC0NCiAgaGVhbHRoemFfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9oZWFsdGh6YV9zZW50IDwtIA0KICBoZWFsdGh6YV9zZW50X3N0ZW0gJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKQ0KDQojYmluZyBzZW50aW1lbnQgYW5hbHlzaXMgb24gSGVhbHRoWkEgdHdlZXRzDQpiaW5nX2hlYWx0aHphIDwtIA0KICBjbGVhbmVkX2hlYWx0aHphX3NlbnQgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgdW5ncm91cCgpDQogIA0KI1Bsb3QNCmJpbmdfaGVhbHRoemEgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgU0EgRGVwYXJ0bWVudCBvZiBIZWFsdGgiLA0KICAgICAgIHkgPSAiQ29udHJpYnV0aW9uIHRvIHNlbnRpbWVudCIsDQogICAgICAgeCA9ICIiKSArDQogIGNvb3JkX2ZsaXAoKSsNCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZV9oYygpDQpgYGANCkFzIHdpdGggdGhlIE5JQ0QgbmVnYXRpdmUgc2VudGltZW50IHZpc3VhbGlzYXRpb24sIOKAmHJlZ3JldHRhYmx54oCZIHNlZW1zIHRvIGJlIHRoZSB3b3JkIGNhcnJ5aW5nIHRoZSB0b3AgbmVnYXRpdmUgc2VudGltZW50IHdpdGhpbiBpbiB0aGVpciB0d2VldHMuIE90aGVyIHdvcmRzIGFyZSwg4oCYcmlza+KAmSwg4oCYdmlydXPigJksIOKAmGJyZWFrZG93buKAmSwg4oCYZGVhdGjigJksIOKAmHN5bXB0b21z4oCZLCDigJhpbmZlY3Rpb25z4oCZLCDigJhpc29sYXRpb27igJksIOKAmGluZmVjdGlvbuKAmSBhbmQg4oCYaW5mZWN0aW9uc+KAmS4g4oCYcHJvdGVjdOKAmSwg4oCYcmVjb3ZlcnnigJksIOKAmGxvdmVk4oCZIGFyZSB0aGUgdG9wIHRocmVlIG1vc3QgcG9zaXRpdmUgd29yZHMsIGZvbGxvd2VkIGJ5IOKAmHBvc2l0aXZl4oCZLCDigJhzYWZl4oCZLCDigJhmZXN0aXZl4oCZLCDigJhzdXBwb3J04oCZLCDigJhwYXRpZW504oCZLCDigJhmcmVl4oCZIGFuZCDigJhjbGVhbuKAmS4NCg0KYGBge3IgTmV3czI0IFNlbnRpbWVudCBBbmFseXNpcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI3NlbGVjdA0KbmV3czI0X3NlbnQgPC0NCiAgbmV3czI0X3R3ZWV0cyAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikNCg0KI3JlbW92YWwgb2YgaHR0cCBlbGVtZW50cw0KbmV3czI0X3NlbnQkc3RyaXBwZWRfdGV4dCA8LSANCiAgZ3N1YigiaHR0cFxcUysiLCAiIixuZXdzMjRfc2VudCR0ZXh0KQ0KDQojdW5uZXN0X3Rva2VucyB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKyByZW1vdmUgcHVuYyArIGFkZCBpbmRpdiB0d2VldCBJRA0KbmV3czI0X3NlbnRfc3RlbSA8LSANCiAgbmV3czI0X3NlbnQgJT4lDQogIHNlbGVjdChzdHJpcHBlZF90ZXh0KSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdHJpcHBlZF90ZXh0KQ0KDQojcmVtb3ZlIHN0b3Agd29yZHMNCmNsZWFuZWRfbmV3czI0X3NlbnQgPC0NCiAgbmV3czI0X3NlbnRfc3RlbSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBOZXdzMjQgdHdlZXRzDQpiaW5nX25ld3MyNCA8LSANCiAgY2xlYW5lZF9uZXdzMjRfc2VudCAlPiUNCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID1UUlVFKSU+JQ0KICB1bmdyb3VwKCkNCiAgDQojUGxvdA0KYmluZ19uZXdzMjQgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgTkVXUzI0ICIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0K4oCYaW5mZWN0aW9uc+KAmSwg4oCYZGVhdGjigJkgYW5kIOKAmHByaXNvbuKAmSBhcmUgYW1vbmcgdGhlIHRvcCB0aHJlZSBtb3N0IG5lZ2F0aXZlIHdvcmRzLiDigJhzdXBwb3J04oCZLCDigJh0b3DigJkgYW5kIOKAmHBvc2l0aXZl4oCZIGFyZSBhbW9uZyB0aGUgdG9wIHRocmVlIG1vc3QgcG9zaXRpdmUgTmV3czI0IHdvcmRzLiBPdGhlciB0aGFuIHRoYXQsIHRoZXJlIGFyZSBubyBvdGhlciBDb3ZpZC0xOSByZWxhdGVkIHdvcmRzLiANCg0KYGBge3IgSGVhbHRoMjQgU2VudGltZW50IEFuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojc2VsZWN0DQpIZWFsdGgyNF9zZW50IDwtIA0KICBoZWFsdGgyNF90aW1lbGluZV9kZiAgJT4lDQogIHNlbGVjdCgic2NyZWVuX25hbWUiLCAidGV4dCIpDQoNCiNtYW51YWwgcmVtb3ZhbCBvZiBodHRwIGVsZW1lbnRzDQpIZWFsdGgyNF9zZW50JHN0cmlwcGVkX3RleHQgPC0gDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsSGVhbHRoMjRfc2VudCR0ZXh0KQ0KDQojdW5uZXN0X3Rva2VucyB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKyByZW1vdmUgcHVuY3R1YXRpb24gKyBhZGQgaW5kaXYgdHdlZXQgSUQNCkhlYWx0aDI0X3NlbnRfc3RlbSA8LSANCiAgSGVhbHRoMjRfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9IZWFsdGgyNF9zZW50IDwtDQogIEhlYWx0aDI0X3NlbnRfc3RlbSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBIZWFsdGgyNHR3ZWV0cw0KYmluZ19IZWFsdGgyNCA8LSANCiAgY2xlYW5lZF9IZWFsdGgyNF9zZW50ICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPVRSVUUpJT4lDQogIHVuZ3JvdXAoKQ0KIA0KI1Bsb3QgDQpiaW5nX0hlYWx0aDI0ICU+JQ0KICBncm91cF9ieShzZW50aW1lbnQpICU+JQ0KICB0b3BfbigxMCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIG4pKSAlPiUNCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gc2VudGltZW50KSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiVHdlZXRzIG9mIEhlYWx0aDI0ICIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0KVGhlIHRvcCBuZWdhdGl2ZSB3b3JkcyBmcm9tIHRoZSBIZWFsdGgyNCB0d2l0dGVyIGhhbmRsZSBhcmUg4oCYcmlza+KAmSwg4oCYY2FuY2Vy4oCZLCDigJhzeW1wdG9tc+KAmSwg4oCYbG9zc+KAmSwg4oCYc3VmZmVy4oCZLCDigJhsb3Nl4oCZLCDigJhzdHJlc3PigJksIOKAmGFsbGVyZ2llc+KAmSwg4oCYcGFpbuKAmSBhbmQg4oCYaW5mZWN0aW9u4oCZLiBUaGUgdG9wIHBvc2l0aXZlIHdvcmRzIGZyb20gSGVhbHRoMjQgYXJlIOKAmGZhbnPigJksIOKAmGhlYWx0aHnigJksIOKAmHdpbuKAmSwg4oCYYmVuZWZpdHPigJksIOKAmHByb3RlY3TigJksIOKAmGJvb3N04oCZLCDigJhzYWZl4oCZLCDigJhpbXByb3Zl4oCZLCDigJh0b3DigJkgYW5kIOKAmGVhc3nigJkuIFRoZSBncmVhdCBtYWpvcml0eSBvZiB0aGVzZSB3b3JkcyBhcmUgaGVhbHRoIHJlbGF0ZWQuIA0KDQoNCmBgYHtyIGVOQ0EgU2VudGltZW50IEFuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojc2VsZWN0DQplbmNhX3NlbnQgPC0gZW5jYV90aW1lbGluZV9kZiAgJT4lDQogIHNlbGVjdCgic2NyZWVuX25hbWUiLCAidGV4dCIpDQoNCiNtYW51YWwgcmVtb3ZhbCBvZiBodHRwIGVsZW1lbnRzDQplbmNhX3NlbnQkc3RyaXBwZWRfdGV4dCA8LSANCiAgZ3N1YigiaHR0cFxcUysiLCAiIixlbmNhX3NlbnQkdGV4dCkNCg0KI3VubmVzdF90b2tlbnMgdG8gY29udmVydCB0byBsb3dlciBjYXNlICsgcmVtb3ZlIHB1bmN0dWF0aW9uICsgYWRkIGluZGl2IHR3ZWV0IElEDQplbmNhX3NlbnRfc3RlbSA8LSANCiAgZW5jYV9zZW50ICU+JQ0KICBzZWxlY3Qoc3RyaXBwZWRfdGV4dCkgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc3RyaXBwZWRfdGV4dCkNCg0KI3JlbW92ZSBzdG9wIHdvcmRzDQpjbGVhbmVkX2VuY2Ffc2VudCA8LQ0KICBlbmNhX3NlbnRfc3RlbSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBlTkNBIHR3ZWV0cw0KYmluZ19lbmNhIDwtDQogIGNsZWFuZWRfZW5jYV9zZW50ICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPVRSVUUpJT4lDQogIHVuZ3JvdXAoKQ0KICANCiNQbG90DQpiaW5nX2VuY2EgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJUd2VldHMgb2YgZU5DQSIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gIiIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lX2hjKCkNCmBgYA0K4oCYYnJlYWtpbmfigJkgaXMgdGhlIG1vc3QgbmVnYXRpdmUgd29yZCB3aXRoaW4gdGhlIGVOQ0EgdHdlZXRzLiDigJhpbmZlY3Rpb25z4oCZLCDigJh2aXJ1c+KAmSBhbmQg4oCYZGVhdGjigJkgYXJlIGFtb25nIHRoZSB0b3AgMTAgbW9zdCBuZWdhdGl2ZSB3b3Jkcy4g4oCYc3VwcG9ydOKAmSDigJhob3TigJkg4oCYZnJlZeKAmSDigJh0b3DigJkg4oCYcHJlbWllcuKAmSDigJhyZWFkeeKAmSDigJh2YWx1YWJsZeKAmSDigJhsZWTigJkg4oCYZGVkaWNhdGVk4oCZIGFuZCDigJhib29zdOKAmSBhcmUgdGhlIHRlbiBtb3N0IHBvc2l0aXZlIHdvcmRzLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQojU0VMRUNUSU9OIE9GIEFMTCBNRURJQSBTT1VSQ0VTIFdJVEggU0VOVElNRU5UDQpCaGVrX2JpbmcgPC0NCiAgdGlkeV9iaGVraXNpc2FfdHdlZXRzICU+JQ0KICBsZWZ0X2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lIA0KICBjb3VudChzZW50aW1lbnQpICU+JSANCiAgc3ByZWFkKHNlbnRpbWVudCwgbiwgZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKHNlbnRpbWVudCA9IHBvc2l0aXZlIC0gbmVnYXRpdmUpIA0KDQpuaWNkX2JpbmcgPC0gDQogIHRpZHlfbmljZF90d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkNCg0KaGVhbHRoemFfYmluZyA8LQ0KICB0aWR5X2hlYWx0aHphX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKQ0KDQpld25fYmluZyA8LSANCiAgdGlkeV9ld25yZXBvcnRlcl90d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNCm5ld3MyNF9iaW5nIDwtDQogIHRpZHlfbmV3czI0X3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSANCg0KR292ZXJubWVudFpBX2JpbmcgPC0gDQogIHRpZHlfR292ZXJubWVudFpBX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSANCg0KaGVhbHRoMjRfYmluZyA8LSANCiAgdGlkeV9oZWFsdGgyNF90d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNClNBZ292bmV3c19iaW5nIDwtIA0KICB0aWR5X1NBZ292bmV3c190d2VldHMgJT4lDQogIGxlZnRfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUgDQogIGNvdW50KHNlbnRpbWVudCkgJT4lIA0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNCnNhYmNfYmluZyA8LSANCiAgdGlkeV9zYWJjX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSAgDQoNCmVuY2FfYmluZyA8LSANCiAgdGlkeV9lbmNhX3R3ZWV0cyAlPiUNCiAgbGVmdF9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JSANCiAgY291bnQoc2VudGltZW50KSAlPiUgDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSANCg0KI0FERElUSU9OIE9GIElEIEFORCBUL0YgVkFMVUUNCm5hbWUgPC0gYygnQmhla2lzaXNhJykNCmtsZXVyIDwtIGMoRkFMU0UpDQpCaGVrX2JpbmcgPC1jYmluZChuYW1lLEJoZWtfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnTklDRCcpDQprbGV1ciA8LSBjKFRSVUUpDQpuaWNkX2JpbmcgPC1jYmluZChuYW1lLG5pY2RfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnSGVhbHRoWkEnKQ0Ka2xldXIgPC0gYyhUUlVFKQ0KaGVhbHRoemFfYmluZyA8LWNiaW5kKG5hbWUsaGVhbHRoemFfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnRVdOcmVwb3J0ZXInKQ0Ka2xldXIgPC0gYyhGQUxTRSkNCmV3bl9iaW5nIDwtY2JpbmQobmFtZSxld25fYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnTmV3czI0JykNCmtsZXVyIDwtIGMoRkFMU0UpDQpuZXdzMjRfYmluZyA8LWNiaW5kKG5hbWUsbmV3czI0X2JpbmcsIGtsZXVyKQ0KDQpuYW1lIDwtIGMoJ0dvdmVybm1lbnRaQScpDQprbGV1ciA8LSBjKFRSVUUpDQpHb3Zlcm5tZW50WkFfYmluZyA8LWNiaW5kKG5hbWUsR292ZXJubWVudFpBX2JpbmcsIGtsZXVyKQ0KDQpuYW1lIDwtIGMoJ0hlYWx0aDI0JykNCmtsZXVyIDwtIGMoRkFMU0UpDQpoZWFsdGgyNF9iaW5nIDwtY2JpbmQobmFtZSxoZWFsdGgyNF9iaW5nLCBrbGV1cikNCg0KbmFtZSA8LSBjKCdTQWdvdm5ld3MnKQ0Ka2xldXIgPC0gYyhUUlVFKQ0KU0Fnb3ZuZXdzX2JpbmcgPC1jYmluZChuYW1lLFNBZ292bmV3c19iaW5nLCBrbGV1cikNCg0KbmFtZSA8LSBjKCdTQUJDJykNCmtsZXVyIDwtIGMoRkFMU0UpDQpzYWJjX2JpbmcgPC1jYmluZChuYW1lLHNhYmNfYmluZywga2xldXIpDQoNCm5hbWUgPC0gYygnZU5DQScpDQprbGV1ciA8LSBjKEZBTFNFKQ0KZW5jYV9iaW5nIDwtY2JpbmQobmFtZSxlbmNhX2JpbmcsIGtsZXVyKQ0KDQoNCiNDb21iaW5hdGlvbiBvZiBBbGwgTWVkaWEgU291cmNlcyBEZXNjcmliZWQgQWJvdmUNCmFsbF9iaW5nX2RmIDwtDQogIGJpbmRfcm93cyhCaGVrX2JpbmcsaGVhbHRoemFfYmluZyxuaWNkX2JpbmcsZXduX2JpbmcsbmV3czI0X2JpbmcsIA0KICAgICAgICAgICAgR292ZXJubWVudFpBX2JpbmcsIGhlYWx0aDI0X2JpbmcsIHNhYmNfYmluZywgZW5jYV9iaW5nLCBTQWdvdm5ld3NfYmluZykNCg0KI1Bsb3QNCmdncGxvdChhbGxfYmluZ19kZiwgYWVzKHggPSBuYW1lLCB5ID0gc2VudGltZW50LCBmaWxsID0ga2xldXIpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDAuMjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0ZGNTcyMiIsICIjMDBBREI1IiksIA0KICAgICAgICAgICAgICAgICAgICBndWlkZSA9IEZBTFNFKSArIA0KICB0aGVtZV9oYygpICsNCiAgeGxhYihOVUxMKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiT3ZlcmFsbCBTZW50aW1lbnQgb2YgZWFjaCBNZWRpYSBTb3VyY2UiLCBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpDQpgYGANCkEgY29uY2x1c2lvbiBjYW4gYmUgbWFkZSB0aGF0IGdvdmVybm1lbnQgYWdlbmNpZXMgYWltIHRvIGltcG9zZSBlbW90aW9ucyBvZiBhIG1vcmUgdHJhbnF1aWwvcG9zaXRpdmUgbmF0dXJlLCBpbiBvcHBvc2l0aW9uIHRvIHByaXZhdGUgYWdlbmNpZXMgd2hvIHNvbGVseSB3YW50IHRvIGludm9rZSBhbiBlbW90aW9uIG9uIGFueSBzaWRlcyBvZiB0aGUgc2VudGltZW50IHNwZWN0cnVtLCBiZWluZyB0aGF0IG91dHJpZ2h0IG5lZ2F0aXZlIG9yIG91dHJpZ2h0IHBvc2l0aXZlLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KbWVkaWFfc2VudCA8LSANCiAgY29tcGxldGVfZGF0YV9zb3VyY2VfZGYgJT4lDQogIHNlbGVjdCgic2NyZWVuX25hbWUiLCAidGV4dCIpDQoNCiNtYW51YWwgcmVtb3ZhbCBvZiBodHRwIGVsZW1lbnRzDQptZWRpYV9zZW50JHN0cmlwcGVkX3RleHQgPC0gDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsbWVkaWFfc2VudCR0ZXh0KQ0KDQojdW5uZXN0X3Rva2VucyB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgKyByZW1vdmUgcHVuY3R1YXRpb24gKyBhZGQgaW5kaXYgdHdlZXQgSUQNCm1lZGlhX3NlbnRfc3RlbSA8LSANCiAgbWVkaWFfc2VudCAlPiUNCiAgc2VsZWN0KHN0cmlwcGVkX3RleHQpICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHN0cmlwcGVkX3RleHQpDQoNCiNyZW1vdmUgc3RvcCB3b3Jkcw0KY2xlYW5lZF9tZWRpYV9zZW50IDwtICANCiAgbWVkaWFfc2VudF9zdGVtICU+JQ0KICBhbnRpX2pvaW4oc3RvcF93b3JkcykNCg0KI2Jpbmcgc2VudGltZW50IGFuYWx5c2lzIG9uIHR3ZWV0cw0KYmluZ19tZWRpYSA8LSBjbGVhbmVkX21lZGlhX3NlbnQgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgdW5ncm91cCgpDQogIA0KI1Bsb3QNCmJpbmdfbWVkaWEgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBzZW50aW1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+c2VudGltZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICBsYWJzKHRpdGxlID0gIlR3ZWV0cyBvZiBBbGwgTWVkaWEgU291cmNlcyIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCwgY2FwdGlvbiA9ICJVcGRhdGVkOiBKdWx5IDIwMjEiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lX2hjKCkNCg0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmNvbXBsZXRlX2RhdGFfc291cmNlX2RmMiA8LQ0KICBiaGVraXNpc2FfdHdlZXRzICU+JQ0KICBmdWxsX2pvaW4oaGVhbHRoemFfdHdlZXRzKSAlPiUNCiAgZnVsbF9qb2luKG5ld3MyNF90d2VldHMpICU+JQ0KICBmdWxsX2pvaW4obmljZF90d2VldHMpICU+JQ0KICBmdWxsX2pvaW4oZW5jYV90aW1lbGluZV9kZikgJT4lDQogIGZ1bGxfam9pbihoZWFsdGgyNF90aW1lbGluZV9kZikNCg0KdmFjY2luZV90d2VldHMgPC0NCiAgZHBseXI6OmZpbHRlcihjb21wbGV0ZV9kYXRhX3NvdXJjZV9kZjIsIGdyZXBsKCd2YWNjaW5lJywgdGV4dCkpDQoNCnZhY2NpbmVfdGV4dCA8LSB2YWNjaW5lX3R3ZWV0cyR0ZXh0DQoNCnZhY2NpbmVfY29ycCA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHZhY2NpbmVfdGV4dCkpDQoNCnR3aXR0ZXJIYW5kbGVSZW1vdmVyIDwtIGZ1bmN0aW9uKHgpIGdzdWIoIkBcXFMrIiwiIiwgeCkNCg0KaGFzaHRhZ1JlbW92ZXIgPC0gZnVuY3Rpb24oeCkgZ3N1YigiI1xcUysiLCIiLCB4KQ0KDQplbW9qaVJlbW92ZXIgPC0gZnVuY3Rpb24oeCkgZ3N1YigiW15ceDAxLVx4NzRGXSIsIiIseCkNCg0KdG9TcGFjZSA9IGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24oeCxwYXR0ZXJuKWdzdWIocGF0dGVybiwiIix4KSkNCg0KY2xlYW5lciA8LSBmdW5jdGlvbih2YWNjaW5lX2NvcnApDQogIHsNCiAgdmFjY2luZV9jb3JwIDwtIA0KICB0bV9tYXAodmFjY2luZV9jb3JwLCB0b1NwYWNlLA0KICAgICAgICAgIj8oZnxodCl0cChzPyk6Ly8oLiopWy5dW2Etel0rIikNCiAgDQogIHZhY2NpbmVfY29ycCA8LSANCiAgICB0bV9tYXAodmFjY2luZV9jb3JwLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHJhbnNmb3JtZXIodHdpdHRlckhhbmRsZVJlbW92ZXIpKQ0KICANCiAgdmFjY2luZV9jb3JwIDwtIA0KICAgIHRtX21hcCh2YWNjaW5lX2NvcnAsDQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90cmFuc2Zvcm1lcihoYXNodGFnUmVtb3ZlcikpDQogIA0KICB2YWNjaW5lX2NvcnAgPC0gDQogICAgdG1fbWFwKHZhY2NpbmVfY29ycCwgcmVtb3ZlUHVuY3R1YXRpb24pDQogIA0KICB2YWNjaW5lX2NvcnAgPC0gDQogICAgdG1fbWFwKHZhY2NpbmVfY29ycCwgZW1vamlSZW1vdmVyKQ0KICANCiAgdmFjY2luZV9jb3JwIDwtIA0KICAgIHRtX21hcCh2YWNjaW5lX2NvcnAsIHN0ZW1Eb2N1bWVudCkNCiAgDQogIHZhY2NpbmVfY29ycCA8LQ0KICAgIHRtX21hcCh2YWNjaW5lX2NvcnAsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpDQogIHJldHVybih2YWNjaW5lX2NvcnApDQp9DQp2YWNjaW5lX2NvcnAgPC0gDQogIGNsZWFuZXIodmFjY2luZV9jb3JwKQ0KDQpuZXdfdmFjY2luZWRmIDwtIA0KICBkYXRhLmZyYW1lKHRleHQgPSBzYXBwbHkodmFjY2luZV9jb3JwLCBhcy5jaGFyYWN0ZXIpLA0KICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KbmV3X3ZhY2NpbmVkZiA8LQ0KICB1bmxpc3QobmV3X3ZhY2NpbmVkZikNCg0KDQpwYXR0ZXJuID0gIl5bWzpzcGFjZTpdXSokIg0KDQp2YWNjaW5lX2RmIDwtDQogIG5ld192YWNjaW5lZGZbZ3JlcChwYXR0ZXJuLCBuZXdfdmFjY2luZWRmLCBpbnZlcnQgPSBUUlVFKV0NCg0KI3NlbnRpbWVudCBhbmFseXNpcw0KDQpzZW50aW1lbnRzX2RmIDwtIA0KICBzZW50aW1lbnRfYXR0cmlidXRlcyh2YWNjaW5lX2RmKQ0KDQpuZXdfMiA8LSANCiAgZ2V0X3NlbnRlbmNlcyh2YWNjaW5lX2RmKQ0KDQp0d2VldF9zZW50aW1lbnQ8LQ0KICBzZW50aW1lbnRfYnkobmV3XzIsIGF2ZXJhZ2luZy5mdW5jdGlvbiA9IGF2ZXJhZ2Vfd2VpZ2h0ZWRfbWl4ZWRfc2VudGltZW50KQ0KDQojdmlzdWFsaXphdGlvbiBvZiBzZW50aW1lbnRzDQojIE1ha2UgdGhlIGdyYXBoDQp2YWNjaW5lX3NlbnRfZ3JhcGggPSBwbG90X2x5KHg9dHdlZXRfc2VudGltZW50JHdvcmRfY291bnQseT10d2VldF9zZW50aW1lbnQkYXZlX3NlbnRpbWVudCxtb2RlPSJtYXJrZXJzIixjb2xvcnMgPWMoIiNGRjU3MjIiLCIjMDBBREI1Iiksc2l6ZT1hYnModHdlZXRfc2VudGltZW50JGF2ZV9zZW50aW1lbnQpLzMgLCBjb2xvcj1pZmVsc2UodHdlZXRfc2VudGltZW50JGF2ZV9zZW50aW1lbnQ+MCwiUG9zaXRpdmUiLCJOZWdhdGl2ZSIpICkgJT4lIA0KI0NoYW5nZSBob3ZlciBtb2RlIGluIHRoZSBsYXlvdXQgYXJndW1lbnQgDQpsYXlvdXQoIGhvdmVybW9kZT0iY2xvc2VzdCIsdGl0bGU9IlNlbnRpbWVudCBhbmFseXNpcyBieSBUd2VldCIseGF4aXM9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIHdvcmRzIHBlciBUd2VldCIsc2l6ZT0xOCkseWF4aXMgPSBsaXN0KHRpdGxlID0gIlNlbnRpbWVudHMgYnkgVHdlZXQiLHNpemU9MTgpKQ0KIyBzaG93IHRoZSBncmFwaA0KdmFjY2luZV9zZW50X2dyYXBoDQpgYGANCg0KIyMgQ29tcGFyaXNvbiBDbG91ZCBvZiB0aGUgU2VudGltZW50IG9mIFNlbGVjdGVkIE1lZGlhIFNvdXJjZXMNCg0KYGBge3IgU2VudGltZW50X0FuYWx5c2lzX0NvbXBhcmlzb25fQ2xvdWQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMgQ29tcGFyaXNvbiBDbG91ZCBvZiB0aGUgU2VudGltZW50IG9mIFNlbGVjdGVkIE1lZGlhIFNvdXJjZXMNCg0KdGlkeV9hbGxfbWVkaWFfdHdlZXRzICU+JQ0KICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJiaW5nIikpICU+JQ0KICBjb3VudCh3b3JkLCBzZW50aW1lbnQsIHNvcnQgPSBUUlVFKSAlPiUNCiAgYWNhc3Qod29yZCB+IHNlbnRpbWVudCwgdmFsdWUudmFyID0gIm4iLCBmaWxsID0gMCkgJT4lDQogIGNvbXBhcmlzb24uY2xvdWQoY29sb3JzID0gYygiI0ZGNTcyMiIsICIjMDBBREI1IiksDQogICAgICAgICAgICAgICAgICAgbWF4LndvcmRzID0gMTAwLCBzY2FsZSA9IGMoNCwgMC41KSkNCmBgYA0KVGhlIG1vc3Qgc2lnbmlmaWNhbnQgd29yZHMgcG90cmF5ZWQgYnkgdGhpcyBhbmFseXNpcyBpcyAnc2FmZScsICdpbmZlY3Rpb25zJywgJ3dvcmsnIGFuZCAncmVjb3ZlcnknIHdoaWNoIGNhbiBhbGwgYmUgcmVsYXRlZCB0byB0aGUgQ292aWQgLTE5IGVwaWRlbWljLg0KDQojIyMgSG93IHRoZXkgZGlmZmZlcjoNCg0KIyMjIyBPdmVyIFRpbWU6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBQbG90IGFsbCB0d2l0dGVyIGFjdGl2aXR5IGluIHdlZWtseSBpbnRlcnZhbHMNCg0KdHNfcGxvdChqb2ludF90aW1lbGluZXMsICJ3ZWVrcyIsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBTaG93aW5nIEFsbCBUd2l0dGVyIEFjdGl2aXR5IG9mIENob3NlbiBNZWRpYSIpICsNCiAgeGxhYigiV2VlayIpICsNCiAgeWxhYigiVHdlZXQgRnJlcXVlbmN5IikNCg0KYGBgDQoNClRpbWUgc2VyaWVzIHNob3dpbmcgYWxsIFR3aXR0ZXIgYWN0aXZpdHkgb2YgY2hvc2VuIG1lZGlhIGluZGljYXRlcyB0aGF0IHRoZSBpcyBhIHN0YXJrIGluY3JlYXNlIGluIFR3aXR0ZXIgYWN0aXZpdHkgaW4gMjAyMS5UaGVyZSBzZWVtcyB0byBiZSBhIHN0cm9uZyBpbmNyZWFzZSBpbiB0d2VldHMgYXQgdGhlIGJlZ2lubmluZyBvZiAyMDIwIGFuZCAyMDIxLiANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQojIEdyb3VwIGJ5IGlzX3JldHdlZXQgYW5kIHBsb3QgbXVsdGlwbGUgdGltZSBzZXJpZXMgb2YgcmV0d2VldHMgdnMgbm9uLXJldHdlZXRzDQoNCmpvaW50X3RpbWVsaW5lcyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGlzX3JldHdlZXQpICU+JQ0KICB0c19wbG90KCJob3VycyIsIGNvbG9yID0gIiMwMEFEQjUiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllczogUmV0d2VldHMgdnMgTm9uLXJldHdlZXRzIikgKw0KICB5bGFiKCJUd2VldCBGcmVxdWVuY3kiKSArDQogIHhsYWIoIkhvdXJzIikNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQojIEdyb3VwIGJ5IHNjcmVlbl9uYW1lIGFuZCBwbG90IGVhY2ggbWVkaWEgc291cmNlJ3MgdGltZSBzZXJpZXMNCg0KdHNfcGxvdChkcGx5cjo6Z3JvdXBfYnkoam9pbnRfdGltZWxpbmVzLCBzY3JlZW5fbmFtZSksIA0KICAgICAgICAid2Vla3MiLCBzaXplID0gMSkgKw0KICB0aGVtZV9oYygpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBUd2VldHMgZnJvbSBJbmRpdmlkdWFsIE1lZGlhIFNvdXJjZXMiLA0KICAgICAgIGNhcHRpb24gPSAiVXBkYXRlZDogSnVseSAyMDIxIikgKw0KICB4bGFiKCJXZWVrIikgKw0KICB5bGFiKCJUd2VldCBGcmVxdWVuY3kiKQ0KDQpgYGANCg0KVGltZSBzZXJpZXMgb2YgdHdlZXRzIGZyb20gaW5kaXZpZHVhbCBtZWRpYSBzb3VyY2VzIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhIHN0YXJrIGluY3JlYXNlIGluIFR3aXR0ZXIgYWN0aXZpdHkgaW4gSnVuZSBhbmQgSnVseSBvZiAyMDIxLlRoZSBtb3N0IGFjdGl2ZSBvZiB0aGVzZSBtZWRpYSBUd2l0dGVyIGFjY291bnRzIGlzIE5ld3MyNC4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBHcm91cCBieSBzY3JlZW5fbmFtZSBhbmQgaXNfcmV0d2VldCwgdGhlbiBwbG90IGluZGl2aWR1YWwgdGltZSBzZXJpZXMNCg0Kam9pbnRfdGltZWxpbmVzICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc2NyZWVuX25hbWUsIGlzX3JldHdlZXQpICU+JQ0KICB0c19wbG90KCJtb250aHMiLCBzaXplID0gMSkgKw0KICB5bGFiKCJUd2VldCBGcmVxdWVuY3kiKSArDQogIHhsYWIoIk1vbnRocyIpICsgDQogIHRoZW1lX2hjKCkgKw0KICBsYWJzKHRpdGxlID0gIlRpbWUgU2VyaWVzIG9mIFR3ZWV0cyBmcm9tIEluZGl2aWR1YWwgTWVkaWEgU291cmNlcyBhbmQgaWYgdGhleSBhcmUgUmV0d2VldHMiLCANCiAgICAgICBjYXB0aW9uID0gIlVwZGF0ZWQ6IEp1bHkgMjAyMSIpDQoNCmBgYA0KDQpUaW1lIHNlcmllcyBvZiB0d2VldHMgZnJvbSBpbmRpdmlkdWFsIG1lZGlhIHNvdXJjZXMsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSB2ZXJ5IGZldyByZXR3ZWV0cyBieSB0aGVzZSBpbmRpdmlkdWFsIHNvdXJjZXMuDQoNCmBgYHtyIFZhY2NpbmVfU2VudGltZW50X0FuYWx5c2lzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIFZBQ0NJTkUgU0VOVElNRU5UIEFOQUxZU0lTIA0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgQmhla2lzaXNhDQpiaGVraXNpc2FfdHdlZXRzJERhdGUgPC0gYXMuRGF0ZShiaGVraXNpc2FfdHdlZXRzJGNyZWF0ZWRfYXQpDQpiaGVraXNpc2FfdHdlZXRzJFRpbWUgPC0gZm9ybWF0KGJoZWtpc2lzYV90d2VldHMkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCmJoZWtfdmFjIDwtIGJoZWtpc2lzYV90d2VldHNbYmhla2lzaXNhX3R3ZWV0cyREYXRlID49ICIyMDIxLTA0LTE0IiAmIGJoZWtpc2lzYV90d2VldHMkRGF0ZSA8PSAiMjAyMS0wNS0zMSIsXQ0KYmhla192YWMxIDwtIGJoZWtpc2lzYV90d2VldHNbYmhla2lzaXNhX3R3ZWV0cyREYXRlID49ICIyMDIxLTA2LTAxIiAmIGJoZWtpc2lzYV90d2VldHMkRGF0ZSA8PSAiMjAyMS0wNy0wOCIsXQ0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgSGVhbHRoMjQNCmhlYWx0aDI0X3RpbWVsaW5lX2RmJERhdGUgPC0gYXMuRGF0ZShoZWFsdGgyNF90aW1lbGluZV9kZiRjcmVhdGVkX2F0KQ0KaGVhbHRoMjRfdGltZWxpbmVfZGYkVGltZSA8LSBmb3JtYXQoaGVhbHRoMjRfdGltZWxpbmVfZGYkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCmhlYWx0aDI0X3ZhYyA8LSBoZWFsdGgyNF90aW1lbGluZV9kZltoZWFsdGgyNF90aW1lbGluZV9kZiREYXRlID49ICIyMDIxLTA0LTE0IiAmIGhlYWx0aDI0X3RpbWVsaW5lX2RmJERhdGUgPD0gIjIwMjEtMDUtMzEiLF0NCmhlYWx0aDI0X3ZhYzEgPC0gaGVhbHRoMjRfdGltZWxpbmVfZGZbaGVhbHRoMjRfdGltZWxpbmVfZGYkRGF0ZSA+PSAiMjAyMS0wNi0wMSIgJiBoZWFsdGgyNF90aW1lbGluZV9kZiREYXRlIDw9ICIyMDIxLTA3LTA4IixdDQoNCg0KI0NvbnZlcnQgY3JlYXRlZF9hdCBjb2x1bW4gaW50byBEYXRlIGFuZCBUaW1lIG9mIE5JQ0QNCm5pY2RfdHdlZXRzJERhdGUgPC0gYXMuRGF0ZShuaWNkX3R3ZWV0cyRjcmVhdGVkX2F0KQ0KbmljZF90d2VldHMkVGltZSA8LSBmb3JtYXQobmljZF90d2VldHMkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCm5pY2RfdmFjIDwtbmljZF90d2VldHNbbmljZF90d2VldHMkRGF0ZSA+PSAiMjAyMS0wNC0xNCIgJiBuaWNkX3R3ZWV0cyREYXRlIDw9ICIyMDIxLTA1LTMxIixdDQpuaWNkX3ZhYzEgPC1uaWNkX3R3ZWV0c1tuaWNkX3R3ZWV0cyREYXRlID49ICIyMDIxLTA2LTAxIiAmIG5pY2RfdHdlZXRzJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgZU5DQQ0KZW5jYV90aW1lbGluZV9kZiREYXRlIDwtIGFzLkRhdGUoZW5jYV90aW1lbGluZV9kZiRjcmVhdGVkX2F0KQ0KZW5jYV90aW1lbGluZV9kZiRUaW1lIDwtIGZvcm1hdChlbmNhX3RpbWVsaW5lX2RmJGNyZWF0ZWRfYXQsIiVIOiVNOiVTIikNCiNzZWxlY3QgdGltZWZyYW1lDQplbmNhX3ZhYyA8LSBlbmNhX3RpbWVsaW5lX2RmW2VuY2FfdGltZWxpbmVfZGYkRGF0ZSA+PSAiMjAyMS0wNC0xNCIgJiBlbmNhX3RpbWVsaW5lX2RmJERhdGUgPD0gIjIwMjEtMDUtMzEiLF0NCmVuY2FfdmFjMSA8LSBlbmNhX3RpbWVsaW5lX2RmW2VuY2FfdGltZWxpbmVfZGYkRGF0ZSA+PSAiMjAyMS0wNi0wMSIgJiBlbmNhX3RpbWVsaW5lX2RmJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgSGVhbHRoWkEgDQpoZWFsdGh6YV90d2VldHMkRGF0ZSA8LSBhcy5EYXRlKGhlYWx0aHphX3R3ZWV0cyRjcmVhdGVkX2F0KQ0KaGVhbHRoemFfdHdlZXRzJFRpbWUgPC0gZm9ybWF0KGhlYWx0aHphX3R3ZWV0cyRjcmVhdGVkX2F0LCIlSDolTTolUyIpDQojc2VsZWN0IHRpbWVmcmFtZQ0KaGVhbHRoemFfdmFjIDwtIGhlYWx0aHphX3R3ZWV0c1toZWFsdGh6YV90d2VldHMkRGF0ZSA+PSAiMjAyMS0wNC0xNCIgJiBoZWFsdGh6YV90d2VldHMkRGF0ZSA8PSAiMjAyMS0wNS0zMSIsXQ0KaGVhbHRoemFfdmFjMSA8LSBoZWFsdGh6YV90d2VldHNbaGVhbHRoemFfdHdlZXRzJERhdGUgPj0gIjIwMjEtMDYtMDEiICYgaGVhbHRoemFfdHdlZXRzJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojQ29udmVydCBjcmVhdGVkX2F0IGNvbHVtbiBpbnRvIERhdGUgYW5kIFRpbWUgb2YgTmV3czI0DQpuZXdzMjRfdHdlZXRzJERhdGUgPC0gYXMuRGF0ZShuZXdzMjRfdHdlZXRzJGNyZWF0ZWRfYXQpDQpuZXdzMjRfdHdlZXRzJFRpbWUgPC0gZm9ybWF0KG5ld3MyNF90d2VldHMkY3JlYXRlZF9hdCwiJUg6JU06JVMiKQ0KI3NlbGVjdCB0aW1lZnJhbWUNCm5ld3MyNF92YWMgPC0gbmV3czI0X3R3ZWV0c1tuZXdzMjRfdHdlZXRzJERhdGUgPj0gIjIwMjEtMDQtMTQiICYgbmV3czI0X3R3ZWV0cyREYXRlIDw9ICIyMDIxLTA1LTMxIixdDQpuZXdzMjRfdmFjMSA8LSBuZXdzMjRfdHdlZXRzW25ld3MyNF90d2VldHMkRGF0ZSA+PSAiMjAyMS0wNi0wMSIgJiBuZXdzMjRfdHdlZXRzJERhdGUgPD0gIjIwMjEtMDctMDgiLF0NCg0KDQojY29tYmluZWQgZGYgZnJvbSAwNC0xNCB0byAwNS0zMQ0KY29tcGxldGVfdmFjX2RmMSA8LQ0KICBiaGVrX3ZhYyAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aHphX3ZhYykgJT4lDQogIGZ1bGxfam9pbihuZXdzMjRfdmFjKSAlPiUNCiAgZnVsbF9qb2luKG5pY2RfdmFjKSAlPiUNCiAgZnVsbF9qb2luKGVuY2FfdmFjKSAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aDI0X3ZhYykgDQoNCiNzZWFyY2ggYWxsIHR3ZWV0cyBjb250YWluaW5nICd2YWNjaW5lJw0KY29tcGxldGVfdmFjX2RmMSA8LSANCiAgZHBseXI6OmZpbHRlcihjb21wbGV0ZV92YWNfZGYxLCBncmVwbCgndmFjY2luZScsIHRleHQpKSAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikgDQogIA0KY29tcGxldGVfdmFjX2RmMSRzdHJpcHBlZF90ZXh0IDwtIA0KICBnc3ViKCJodHRwXFxTKyIsICIiLGNvbXBsZXRlX3ZhY19kZjEkdGV4dCkNCg0KY29tcGxldGVfc2VudF9kZjEgPC0gDQogIGNvbXBsZXRlX3ZhY19kZjEgJT4lDQogIHNlbGVjdChzdHJpcHBlZF90ZXh0KSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzdHJpcHBlZF90ZXh0KQ0KDQpjb21wbGV0ZV9zZW50X2RmMSAlPiUNCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpDQoNCiNiaW5nIHNlbnRpbWVudCBhbmFseXNpcyBvbiBjb21wbGV0ZV92YWNfZGYxIHR3ZWV0cw0KY29tcGxldGVfc2VudF9kZjEgPC0gY29tcGxldGVfc2VudF9kZjEgJT4lDQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImJpbmciKSkgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9VFJVRSklPiUNCiAgY291bnQoc2VudGltZW50KSU+JQ0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lIA0KICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkgDQoNCg0KbmFtZSA8LSBjKCcxNCBBcHJpbC0gMzEgTWF5IDIwMjEnKQ0Ka2xldXIgPC0gYyhGQUxTRSkNCg0KY29tcGxldGVfc2VudF9kZjEgPC0NCiAgY2JpbmQobmFtZSxjb21wbGV0ZV9zZW50X2RmMSwga2xldXIpDQoNCiNjb21iaW5lZCBkZiBmcm9tIDA2LTAxIHRvIDA3LTA4DQpjb21wbGV0ZV92YWNfZGYyIDwtDQogIGJoZWtfdmFjMSAlPiUNCiAgZnVsbF9qb2luKGhlYWx0aHphX3ZhYzEpICU+JQ0KICBmdWxsX2pvaW4obmV3czI0X3ZhYzEpICU+JQ0KICBmdWxsX2pvaW4obmljZF92YWMxKSAlPiUNCiAgZnVsbF9qb2luKGVuY2FfdmFjMSkgJT4lDQogIGZ1bGxfam9pbihoZWFsdGgyNF92YWMxKQ0KDQojc2VhcmNoIGFsbCB0d2VldHMgY29udGFpbmluZyAndmFjY2luZScNCg0KY29tcGxldGVfdmFjX2RmMiA8LSANCiAgZHBseXI6OmZpbHRlcihjb21wbGV0ZV92YWNfZGYyLCBncmVwbCgndmFjY2luZScsIHRleHQpKSAlPiUNCiAgc2VsZWN0KCJzY3JlZW5fbmFtZSIsICJ0ZXh0IikgDQogIA0KY29tcGxldGVfdmFjX2RmMiRzdHJpcHBlZF90ZXh0IDwtDQogIGdzdWIoImh0dHBcXFMrIiwgIiIsY29tcGxldGVfdmFjX2RmMiR0ZXh0KQ0KDQpjb21wbGV0ZV9zZW50X2RmMiA8LSBjb21wbGV0ZV92YWNfZGYyICU+JQ0KICBzZWxlY3Qoc3RyaXBwZWRfdGV4dCkgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgc3RyaXBwZWRfdGV4dCkNCg0KY29tcGxldGVfc2VudF9kZjIgJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzKQ0KDQojYmluZyBzZW50aW1lbnQgYW5hbHlzaXMgb24gY29tcGxldGVfdmFjX2RmMSB0d2VldHMNCmNvbXBsZXRlX3NlbnRfZGYyIDwtIA0KICBjb21wbGV0ZV9zZW50X2RmMiAlPiUNCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID1UUlVFKSU+JQ0KICBjb3VudChzZW50aW1lbnQpJT4lDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKQ0KDQoNCm5hbWUgPC0gYygnMSBKdW5lLSA4IEp1bHkgMjAyMScpDQprbGV1ciA8LSBjKEZBTFNFKQ0KY29tcGxldGVfc2VudF9kZjIgPC0NCiAgY2JpbmQobmFtZSxjb21wbGV0ZV9zZW50X2RmMiwga2xldXIpDQoNCiNiaW5kIGJvdGggc2VudGltZW50IGRmcw0KY29tcGxldGVfZGYgPC0NCiAgYmluZF9yb3dzKGNvbXBsZXRlX3NlbnRfZGYyLCBjb21wbGV0ZV9zZW50X2RmMSkNCiAgDQojcGxvdCBib3RoIHNlbnRpbWVudCBkZiBvbiBvbmUgcGxvdCwgDQpnZ3Bsb3QoY29tcGxldGVfZGYsIGFlcyh4ID0gc29ydChuYW1lLCBkZWNyZWFzaW5nID0gVCksIHkgPSBzZW50aW1lbnQsIGZpbGwgPSBrbGV1cikpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMC4yNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBBREI1IiksIGd1aWRlID0gRkFMU0UpKw0KICB0aGVtZV9oYygpKw0KICBsYWJzKHRpdGxlID0gIlR3ZWV0cyBjb250YWluaW5nICd2YWNjaW5lJyIsDQogICAgICAgeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCwgc3VidGl0bGUgPSAiRnJvbSAxNCBBcHJpbCB0byA4IEp1bHkgMjAyMSAiKSANCg0KYGBgDQpUaGUgYWJvdmUgdmlzdWFsaXNhdGlvbiB0YWtlcyB0d2VldHMgY29udGFpbmluZyB0aGUgdGVybSAndmFjY2luZScgYW5kIG1lYXN1cmVzIGl0cycgZnJlcXVlbmN5IGZyb20gMSBKdW5lIHRvIDMxIE1heSAyMDIxLiBUbyBlbXBoYXNpc2UgdGhlIGRpZmZlcmVuY2UgaW4gc2VudGltZW50LCB0aGlzIHRpbWVsaW5lIHdhcyBzcGxpdCBpbiB0d28gY2h1bmtzLCBvbmUgYmVpbmcgJzEgSnVuZS0gOCBKdWx5IDIwMjEnIGFuZCB0aGUgb3RoZXIgJzE0IEFwcmlsLSAzMSBNYXkgMjAyMScuIE9uZSBjYW4gc2VlIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gbmVnYXRpdmUgc2VudGltZW50IG9udG8gdGhlIHNlY29uZCB0aW1lbGluZSBzZW50aW1lbnQuIA0KDQoNCg0KIyBBZGRpdGlvbmFsIFJlcXVpcmVtZW50czoNCg0KIyMjIyBCeSBNZWRpYSBTb3VyY2U6DQoNCmBgYHtyIENvdmlkMTlfVmFjY2luZV9EYXRhX0NvbXBhcmlzb25fV2l0aF9Ud2VldHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBDb252ZXJ0aW5nIGFuZCBmb3JtYXR0aW5nIGRhdGVzDQoNCnZhY2NpbmVfdHdlZXRzJERhdGUgPC0gDQogIGFzLkRhdGUodmFjY2luZV90d2VldHMkY3JlYXRlZF9hdCkNCg0KdmFjY2luZV90d2VldHMkVGltZSA8LSANCiAgZm9ybWF0KHZhY2NpbmVfdHdlZXRzJGNyZWF0ZWRfYXQsIiVIOiVNOiVTIikNCg0KdmFjY2luYXRpb25zJERhdGUgPC0gDQogIGFzLkRhdGUodmFjY2luYXRpb25zJGRhdGUpDQoNCiMgVW4tbmVzdGluZyB0b2tlbnMgb2YgdHdlZXRzDQoNCnRpZHlfdmFjY2luZV90d2VldHMgPC0gDQogIHZhY2NpbmVfdHdlZXRzICU+JQ0KICAgIHNlbGVjdChjcmVhdGVkX2F0LHRleHQpICU+JQ0KICAgIHVubmVzdF90b2tlbnMoIndvcmQiLCB0ZXh0KQ0KDQojIENsZWFuaW5nIGFuZCBmaWx0ZXJpbmcgZm9yIHZhY2NpbmUgd29yZHMNCg0KdmFjY2luZV93b3JkcyA8LSANCiAgdmFjY2luZV90d2VldHMgJT4lDQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIiZhbXA7fCZsdDt8Jmd0OyIpLA0KICB0ZXh0ID0gc3RyX3JlbW92ZV9hbGwodGV4dCwgIlxccz8oZnxodCkodHApKHM/KSg6Ly8pKFteXFwuXSlbXFwufC9dKFxcUykiKSwNCiAgdGV4dCA9IHN0cl9yZW1vdmVfYWxsKHRleHQsICJbXlx4MDEtXHg3Rl0iKSkgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQsIHRva2VuID0gInR3ZWV0cyIpICU+JQ0KICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsDQogICF3b3JkICVpbiUgc3RyX3JlbW92ZV9hbGwoc3RvcF93b3JkcyR3b3JkLCAiJyIpLA0KICBzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpLA0KICAhc3RyX2RldGVjdCh3b3JkLCAiXiMiKSwgDQogICFzdHJfZGV0ZWN0KHdvcmQsICJAXFxTKyIpKSAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpDQoNCiMgUGxvdCB0aGUgZnJlcXVlbmN5IG9mIHZhY2NpbmUgdHdlZXRzIG92ZXIgdGltZQ0KDQp0c19wbG90KHZhY2NpbmVfdHdlZXRzKSArDQogIGdndGl0bGUoIkxpbmUgR3JhcGggc2hvd2luZyB0aGUgZnJlcXVlbmN5IG9mIHZhY2NpbmUgdHdlZXRzIG92ZXIgdGltZSIpDQoNCmBgYA0KDQpUaW1lIHNlcmllcyBsaW5lIGdyYXBoIHNob3dpbmcgdGhlIHRoZSBmcmVxdWVuY3kgb2YgdmFjY2luZSB0d2VldHMgb3ZlciB0aW1lIGluZGljYXRlcyB0aGUgZnJlcXVlbmN5IG9mICB0d2VldHMgcGVydGFpbmluZyB0byB2YWNjaW5hdGlvbnMgaW4gU291dGggQWZyaWNhIGlzIHNoYXJwbHkgaW5jcmVhc2luZy4NCg0KYGBge3IgRGFpbHlfVmFjX1Bsb3QsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBQbG90IExpbmUgR3JhcGggZ3JhcGggU2hvd2luZyBEYWlseSBWYWNjaW5hdGlvbnMgT3ZlciBUaW1lDQoNCmdncGxvdCh2YWNjaW5hdGlvbnMsIA0KICAgICAgIGFlcyh4ID0gcm91bmRfZGF0ZQ0KICAgICAgICAgICAocGFyc2VfZGF0ZV90aW1lDQogICAgICAgICAgICAgKGRhdGUsICJZJS9tJS9kJSIpLA0KICAgICAgICAgICAgIHVuaXQgPSAiZGF5IiksIA0KICAgICAgICAgICB5ID0gdmFjY2luYXRlZF9kYWlseSkpICsNCiAgZ2VvbV9saW5lKHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgDQogICAgICAgICAgICBzaXplID0gMSkgKw0KICB4bGFiKCJEYXRlIikgKw0KICB5bGFiKCJEYWlseSBWYWNjaW5hdGlvbnMiKSArDQogIGdndGl0bGUoIkxpbmUgR3JhcGggZ3JhcGggU2hvd2luZyBEYWlseSBWYWNjaW5hdGlvbnMgT3ZlciBUaW1lIikNCg0KYGBgDQoNCkxpbmUgZ3JhcGggc2hvd2luZyB0aGUgZGFpbHkgdmFjY2luYXRpb25zIG92ZXIgdGltZSBzaGFycGx5IGluY3JlYXNpbmcgYXMgbW9yZSBwZW9wbGUgYXJlIHBlcm1pdHRlZCB0byBiZSB2YWNjaW5hdGVkLiANCg0KYGBge3IgVG90YWxfVmFjX3Bsb3QsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCg0KIyBQbG90IGxpbmUgZ3JhcGggc2hvd2luZyB0b3RhbCB2YWNjaW5hdGlvbnMgb3ZlciB0aW1lDQoNCmdncGxvdCgpICsNCiAgZ2VvbV9saW5lKHZhY2NpbmF0aW9ucywNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHJvdW5kX2RhdGUNCiAgICAgICAgICAgICAgICAocGFyc2VfZGF0ZV90aW1lDQogICAgICAgICAgICAgICAgICAoZGF0ZSwgIlklL20lL2QlIiksDQogICAgICAgICAgICAgICAgICB1bml0ID0gImRheSIpLA0KICAgICAgICAgICAgICAgIHkgPSB2YWNjaW5hdGVkX3RvdGFsKSwNCiAgICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICAgICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICAgIHNpemUgPSAxKSArDQogIHhsYWIoIkRhdGUiKSArDQogIHlsYWIoIlRvdGFsIFZhY2NpbmF0aW9ucyIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsNTAwMDAwMCkpICsNCiAgZ2d0aXRsZSgiTGluZSBHcmFwaCBncmFwaCBTaG93aW5nIFRvdGFsIFZhY2NpbmF0aW9ucyBPdmVyIFRpbWUiKQ0KYGBgDQoNClRoZSBsaW5lIGdyYXBoIHNob3dpbmcgdGhlIHRvdGFsIHZhY2NpbmF0aW9ucyBzaG93cyBzdGVlcCBpbmNyZWFzZXMgd2hlbmV2ZXIgbmV3IGFnZSBncm91cHMgYXJlIHBlcm1pdHRlZCB0byBiZSB2YWNjaW5hdGVkLiANCg0KV2hlbiB0YWtpbmcgYWxsIHRocmVlIGNoYXJ0cyBpbnRvIGFjY291bnQgaXQgY2FuIGJlIHN1cm1pc2VkIHRoYXQgdGhlcmUgaXMgYSBjb3JyZWxhdGlvbiB3aGVuIG9ic2VydmluZyB0aGUgbW9yZSBhZ2UgZ3JvdXBzIGFyZSBwZXJtaXR0ZWQgdG8gYmUgdmFjY2luYXRlZCBpbiBTb3V0aCBBZnJpY2EsdGhlIG1vcmUgdHdlZXRzIHBlcnRhaW5pbmcgdG8gdmFjY2luZXMgYXJlIG1hZGUuDQoNCiMgUmVwb3J0IFN1bW1hcnk6DQoNClRoZSB2aXN1YWxpc2F0aW9ucyBkcmF3biBmcm9tIHRoZSB0ZXh0IGFuYWx5c2lzIG1ldGhvZHMgdXNlZCBpbiB0aGlzIHJlcG9ydCBkaXNwbGF5IGNlcnRhaW4gY29tbW9uIGNoYXJhY3RlcmlzdGljcyBmcm9tIHdoaWNoIGNlcnRhaW4gY29uY2x1c2lvbnMgY2FuIGJlIGRvY3VtZW50ZWQuIFRoZXJlIHNlZW1zIHRvIGJlIGEgZGlmZmVyZW5jZSBpbiBob3cgc2VsZWN0ZWQgbWVkaWEgc291cmNlcyBwcmVzZW50IGluZm9ybWF0aW9uIHJlZ2FyZGluZyBDT1ZJRC0xOSBhbmQgaXRzIHVuZGVybHlpbmcgYnJhbmNoZXMsIHN1Y2ggYXMgZGVhdGhzLCB2YWNjaW5hdGlvbnMsIGFuZCB0ZXN0cy4gQWxzbywgdGhlIHBlcnRhaW5pbmcgc2VudGltZW50IGFuZCB0b3BpY3Mgb2YgdGhlc2Ugc3ViamVjdHMuDQoNClZhY2NpbmF0aW9ucyBzZWVtIHRvIGJlIHJlZmxlY3RpbmcgYW4gaW5jcmVhc2luZ2x5IG5lZ2F0aXZlIGNvbm5vdGF0aW9uIGZyb20gaXRzIGluaXRpYWwgc3Bpa2UgaW4gdXNlIHdpdGhpbiB0aGUgdHdlZXRzIG9mIGFsbCB0ZW4gbWVkaWEgc291cmNlcy4gVGhlIG9jY3VycmVuY2Ugb2YgaW5jcmVhc2luZyBuYXRpb25hbCB2YWNjaW5hdGlvbnMgZ3JvdyBwYXJhbGxlbCB3aXRoIHRoYXQgb2Yg4oCYdmFjY2luZeKAmSBiZWluZyBtZW50aW9uZWQgaW4gdHdlZXRzLiBBcyBkZXNjcmliZWQsIHRoZSBpbmNyZWFzZSBvZiB2YWNjaW5hdGlvbnMgaW4geW91bmdlciBhZ2UgZ3JvdXBzIGFyZSBhbHNvIHJlZmxlY3Rpbmcgb24g4oCYdmFjY2luZeKAmSBpbmNyZWFzaW5nbHkgb2NjdXJyaW5nIGluIHR3ZWV0cyBmcm9tIHRoZXNlIHNvdXJjZXMuDQoNCkNvbnRyYXJ5IHRvIG91ciBiZWxpZWYsIOKAmHRlc3Rz4oCZIG9yIOKAmHRlc3RpbmfigJkgd2FzIG5vdCBhcyBwb3B1bGFyIGFzIGV4cGVjdGVkLCBhcyBpdCB3YXMgYSBtYWpvciBzdWJqZWN0IG1hdHRlciBpbiB0aGUgaW5pdGlhbCByaXNlIG9mIENPVklEIC0xOSwgYmFjayBpbiAyMDIwLiDigJhjb3ZpZOKAmSBpcyBtZW50aW9uZWQgd2l0aGluIGV2ZXJ5IHRvcCAxMCB3b3JkcyBvciBoYXNodGFncyBvZiBhbGwgdGVuIHVzZWQgbWVkaWEgc291cmNlcy4gSW5kaWNhdGluZyB0aGF0IGl0IHN0aWxsIGlzIGFuZCBoYXMgYmVlbiBhIHZlcnkgcG9wdWxhciB0ZXJtIHVzZWQgb3ZlciBhIG51bWJlciBvZiBtb250aHMuIOKAmHZpcnVz4oCZLCDigJhpbmZlY3Rpb27igJkgYW5kIOKAmGRlYXRo4oCZIHNlZW0gdG8gYmUgdGhlIG1vc3QgaGVhdmlseSBuZWdhdGl2ZSB3b3JkcyB1c2VkIGluIHRoZSB0d2VldHMgYnkgdGhlIGNob3NlbiBtZWRpYSBzb3VyY2VzLCB3aGljaCBhcmUgQ09WSUQtcmVsYXRlZC4gQW1vbmcgb3RoZXIgdG9wIHRlbiBuZWdhdGl2ZSB3b3JkcyBhcmUg4oCYc3ltcHRvbXPigJkgYW5kIOKAmHJpc2vigJkuIERpZmZlcmVuY2VzIGluIHNlbnRpbWVudCBiZXR3ZWVuIHByaXZhdGUgYW5kIGdvdmVybm1lbnQgc291cmNlcyBzaG91bGQgYmUgbm90ZWQuIA0KDQpJbiBzdW1tYXRpb24sIHdpdGggcmVnYXJkcyB0byB0aGUgdG9waWMgbW9kZWxsaW5nIHNlY3Rpb24sIHdlIHdlcmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGhpZ2hlc3QgVEYtSURGIChUZXJtIEZyZXF1ZW5jeS1JbnZlcnNlIERvY3VtZW50IEZyZXF1ZW5jeSkgd29yZHMgaW4gdGhlIHNpeCBzZWxlY3RlZCBtZWRpYSBzb3VyY2VzLCB0aGUgaGlnaGVzdCB3b3JkIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggdG9waWMsIHRoZSB0b3AgdGVuIG1lZGlhIHRvcGljcyBhY2NvcmRpbmcgdG8gdGhlIGJldGEgbWF0cml4IGF0IHRvcGljIGxldmVsIDEsIGFzIHdlbGwgYXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiB3b3JkIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggdG9waWMuIOKAmGNvdmlk4oCZIGhhcyBhIG5vdGFibGUgcHJlc2VuY2Ugd2l0aGluIGFsbCB0aGVzZSBhbmFseXNpcyBtZXRob2RzLiANCg0KSW4gcmVnYXJkIHRvIHRoZSB0ZXh0IG5ldHdvcmtzLCB3ZSB3ZXJlIGFibGUgdG8gaWRlbnRpZnkgdHdvIGNsdXN0ZXJzIG9yIGNvbW11bml0aWVzIHdpdGhpbiB0aGUgYXV0aG9yLWJhc2VkIHByb2plY3Rpb24gdGV4dCBuZXR3b3JrIGFuZCBzaXggY2x1c3RlcnMgb3IgY29tbXVuaXRpZXMgd2l0aGluIHRoZSB3b3JkLWJhc2VkIHByb2plY3Rpb24gdGV4dCBuZXR3b3JrLiBGcm9tIHRoZXNlIHRleHQgbmV0d29ya3Mgd2Ugd2VyZSBhYmxlIHRvIGRlcml2ZSBpbnNpZ2h0IGZyb20gd2hpY2ggd29yZCBvciBtZWRpYSBzb3VyY2VzIGhhdmUgYSBzdHJvbmcgc2ltaWxhcml0eSB3aXRoIGVhY2ggb3RoZXIuDQoNCiMgUmV0cm9zcGVjdGl2ZToNCg0KTG9va2luZyBiYWNrIHRoZXJlIGFyZSBhIGZldyBwb2ludHMgdGhlIHByb2plY3QgZ3JvdXAgd291bGQgbGlrZSB0byBoYXZlIGNoYW5nZWQuIEZpcnN0bHksIGFlc3RoZXRpYyBlbmhhbmNlbWVudHMgZm9yIGdyYXBoIHZpc3VhbGl6YXRpb25zIHN1Y2ggYXMgbnVtZXJpYyB2YWx1ZXMgb24gdG9wIG9mIGJhciBjaGFydCBiaW5zIGFuZCBiZXR0ZXIgdGFidWxhciB2aXN1YWxpemF0aW9ucy4gU2Vjb25kbHksIGEgZ3JlYXRlciB1c2Ugb2YgdGhlIGBgYFZhZGVyYGBgIGFuZCBgYGBzZW50aW1lbnRSYGBgIHBhY2thZ2VzLiBUaGlyZGx5LCBtb3JlIGV4dGVybmFsIENPVklELTE5IGRhdGEgdGhhdCBjb3VsZCBiZSAgY29sbGF0ZWQgd2l0aCBUd2l0dGVyIGRhdGEuIEZpbmFsbHksIGNvbWJpbmluZyB0aGUgVHdpdHRlciB0aW1lIHNlcmllcyBwbG90cyB3aXRoIGxvY2tkb3duIGxldmVsIGFuZCBpbmZlY3Rpb24gd2F2ZSBvdmVybGF5cy4NCg==